Objetos armazenados sem dor de cabeça: um exemplo simples de trabalho com objetos Caché no ObjectScript e Python
Castelo de NeuschwansteinEm junho de 2020, exatamente 50 anos de data warehouses tabulares ou, formalmente, um modelo de dados relacionais. Aqui está um documento oficial -
esse mesmo artigo famoso . Pelo qual agradecemos ao Dr. Edgar Frank Codd. E, a propósito, o modelo de dados relacionais está na lista da Forbes das mais importantes inovações globais dos últimos 100 anos.
Por outro lado, por incrível que pareça, Codd considerou os bancos de dados relacionais e a linguagem SQL uma implementação distorcida de sua teoria. Como guia, ele até desenvolveu 12 regras que todo sistema de gerenciamento de banco de dados relacional deve atender (na verdade, são 13 regras). E, na verdade, hoje, no mundo, não é possível encontrar um DBMS que satisfaça pelo menos a regra 0 do Codd e, portanto, ninguém pode chamar o DBMS de 100% relacional :) Talvez haja exceções, diga-me?
O modelo relacional não é muito complexo e é estudado longitudinalmente. Pode até ser estudado muito profundamente. Enquanto isso, neste ano de 2019, também celebraremos outro aniversário - exatamente há 10 anos, a hashtag #NoSQL, mais tarde, “não apenas SQL” apareceu no Twitter e iniciou sua rápida penetração na prática de desenvolver modelos de banco de dados.
Por que uma introdução tão longa? O fato de o universo da programação consistir em dados (e algoritmos, é claro), e a posição de monopólio do modelo relacional leva, como é mais educado a dizer, uma consciência dividida do programador. Como os objetos de trabalho na cabeça do desenvolvedor (OOP também são totais, certo?), Todas essas listas, filas, árvores, montes, dicionários, encadeamentos etc. não são tabelas.
E se você continuar e se lembrar da arquitetura de armazenamento no DBMS moderno? Digamos diretamente, ninguém em sã consciência armazena dados na forma de tabelas. Os desenvolvedores de DBMS geralmente usam variedades da árvore B (por exemplo, no PostrgeSQL) ou, muito menos frequentemente, armazenamento baseado em dicionário. Por outro lado, as barricadas, desenvolvedores que usam DBMSs para armazenar, também operam em não tabelas. E isso força os programadores a fechar constantemente a lacuna semântica com uma camada de dados intermediária desajeitada. E, assim, causam tensão dicotômica interna, desconforto sistêmico e insônia para depuração.
Ou seja, em resumo, existe uma contradição - empacotamos os dados em objetos adequados para a tarefa e, ao salvá-los, devemos cuidar de algumas tabelas.
Desesperança? Não :) Mas e o mapeamento objeto-relacional, ele é comum nas pessoas do ORM? Deixemos
esta guerra santa para Yegor Bugaenko com camaradas. E toda essa história do século passado, como
segundo o tio Bob, não deveria nos preocupar .
É claro, vale ressaltar que o “pacote com bytes” (Robert Martin “Pure Architecture”) pode ser serializado e solto em um arquivo ou enviado para outro fluxo adequado. Mas, em primeiro lugar, ele imediatamente nos limitará no idioma e, em segundo lugar, agora vamos nos preocupar apenas com o armazenamento no DBMS.
Há uma exceção agradável a esses altos e baixos com sacos de bytes - o Intersystems Caché DBMS (e agora a plataforma de dados InterSystems IRIS). Este é provavelmente o único DBMS no mundo que não esconde o óbvio do desenvolvedor e ainda vai além - ele o libera de pensar em "como armazenar tudo corretamente". Basta dizer que a classe continua com o gênero Persistent e o ponto está no chapéu,
isto é, em globais (não confunda com variáveis globais!).
Todos os tipos de dados podem ser armazenados, incluindo caracteres e fluxos binários. Aqui está um exemplo simples:
// - // : , , , , Class FW.Events Extends %Persistent { Property "My name" As %String; } // // «» set haJS = ##class(FW.Events).%New() // write haJS.%Id()
Além disso, e isso é maravilhoso, você pode se comunicar com objetos armazenados não apenas no ObjectScript, nativo do Caché, mas também em recuperá-los e salvá-los diretamente em Python, Java, JavaScript, C ++, C #, Perl. E até, oh horror :). Também é possível obter informações dos mesmos objetos diretamente por meio de consultas SQL e também é possível chamar seus próprios métodos em objetos. Mais precisamente, os métodos nesse caso por si mesmos (e a palavra mágica SqlProc) se transformam em procedimentos armazenados. Toda a magia já está sob o capô do DBMS Caché.
Como obter acesso de teste gratuito ao Intersystems Caché DBMS?
Isso é absolutamente real, não importa o que as línguas malignas digam! :) Você pode baixar e instalar a versão completa do Caché para um único usuário aqui (você precisará se registrar gratuitamente). As compilações estão disponíveis para MacOS, Windows e Linux.
É mais conveniente trabalhar com o código ObjectScript e acessar diretamente diretamente o servidor Caché DBMS (e a plataforma InterSystems IRIS) usando o Atelier IDE, que é baseado no Eclipse. Todas
as instruções de
download e instalação estão
aqui .
Para quem é mais conveniente e familiar, você pode usar o código simples e confortável do Visual Studio, complementando-o com o plug-in ObjectScript desenvolvido pela comunidade.
E agora alguns exemplos práticos. Vamos tentar criar alguns objetos relacionados e trabalhar com eles no ObjectScript e Python. A integração com outros idiomas é implementada de maneira muito semelhante. O Python é escolhido por motivos de "afinidade máxima" com o ObjectScript - as duas linguagens são programáveis, suportam OOP e não possuem digitação forte :)
Para obter exemplos de exemplos, recorremos a vigorosos projetos de Khabarovsk (que não devem ser confundidos com Khabrovsk!) Da "estrutura de reunião para sentar-se". O código-fonte ideológico está em
github.com/Hajsru/framework-weekend E nosso código-fonte é mais baixo em texto.
Uma nuance importante para os usuários do macOS. Ao iniciar os módulos de suporte para Python, lembre-se de especificar o caminho DYLD_LIBRARY_PATH para o diretório em que você instalou o Caché. Por exemplo, assim:
exportar DYLD_LIBRARY_PATH = / application / Cache / bin: $ DYLD_LIBRARY_PATH
Isso é indicado especificamente na documentação.
Criamos classes armazenadas no ObjectScript
Então vamos lá. As aulas no Caché serão muito simples. Você pode ficar sem um IDE - copie o código da classe diretamente através do portal da instância da plataforma Caché (sim, o Caché DBMS está longe de ser um DBMS): Navegador do sistema> Classes> Importar (namespace USER).
Após salvar, os objetos aparecerão nos globos com nomes correspondentes aos nomes das classes correspondentes. Consulte também o portal de gerenciamento do Caché: System Browser> Globals (namespace USER).
// , , Class FW.Event Extends %Persistent { Property title as %String; Property description as %String; Property date as %Date; Property visitors as list of FW.Attendee; } // / Class FW.Attendee Extends %Persistent { Property name As %String; }
Acessando objetos no Caché a partir de Python
Primeiro, conecte-se ao banco de dados Caché DBMS. Repetimos como
na documentação .
Apenas um fato útil para se trabalhar. Gratuito, é também uma versão de treinamento do Caché DBMS, que permitirá que você faça tudo o que está disponível na versão totalmente funcional, mas permite apenas duas conexões ativas. Portanto, ao mesmo tempo, não será possível manter uma conexão do IDE e tentar executar outro código para interagir com o servidor. A solução mais simples encontrada é fechar o IDE enquanto o código Python estiver em execução.
E agora vamos criar um banco de dados de objetos de eventos de TI e seus participantes. Muito muito simples O primeiro é criar uma classe para registrar e armazenar informações sobre o participante do evento. Para simplificar a classe, apenas o nome do membro.
Como você pode ver, usamos funções de wrapper prontas para métodos de acessar os campos de objetos no Caché: set e nos parâmetros passamos o nome da propriedade entre aspas e openid com o nome do pacote e da classe. Sobre uma função get semelhante, há exemplos abaixo. Para acessar outros métodos, incluindo os herdados pela classe de seus ancestrais, use a função run_obj_method () com o nome do método e os parâmetros de chamada, se necessário.
A mágica mais importante da linha: self.att.run_obj_method ("% Save", [])
É assim que temos a capacidade de salvar objetos com referência direta e sem a necessidade de usar bibliotecas e estruturas adicionais, como ORMs onipresentes e desagradáveis.
Além disso, dada a natureza orientada a objetos do ObjectScript, juntamente com os métodos de sua classe (em nosso exemplo, não os fizemos), obtemos um bônus do acesso do Python a todo o conjunto de métodos herdados da classe Persistent e de seus ancestrais.
Aqui está a lista completa , se isso.
Crie o primeiro membro:
att = Attendee() att.new("")
Depois de executar esse código, um global aparecerá no banco de dados com o nome FW.AttendeeD e o conteúdo do objeto recém salvo, como na captura de tela:

Após salvar, este objeto possui seu próprio ID (com número 1). Portanto, você pode carregá-lo em nosso programa usando este id:
att = Attendee() att.use(1) print (att.att.get("name"))
E agora, novamente sabendo a identificação, se necessário, você pode excluir o objeto do banco de dados dos participantes:
att = Attendee() att.use(1) att.clean()
Verifique, depois de executar este exemplo, o registro sobre o objeto deve desaparecer no global. Embora os dados baixados ainda permaneçam na memória do seu objeto até o programa terminar.
Vamos dar o próximo passo. Crie os registros de eventos reais.
A estrutura da classe é quase a mesma que a do aluno acima. Mais importante, apareceu um método para adicionar participantes à lista de participantes deste evento addAttendee (att).
Tentamos criar um registro de objeto sobre um novo evento e salvá-lo no banco de dados:
haJS = Event() haJS.new("haJS", " ", "2019-01-19")
Deverá ocorrer algo assim (observe que a data é convertida automaticamente no formato ObjectScript e, quando carregada de volta no objeto Python, ela retorna ao formato original):

Resta adicionar o participante ao evento:
Portanto, esses exemplos mostram que não é necessário pensar ao mesmo tempo sobre seu modelo de dados e seu esquema de armazenamento tabular. Você pode usar ferramentas mais óbvias para suas tarefas.
Instruções detalhadas para conectar e usar o Caché com Python e outras linguagens estão sempre
disponíveis para você na documentação e no portal da comunidade de desenvolvedores da InterSystems - isso representa nada menos que 5.000 membros da
community.intersystems.comAjuda: O DBMS multimodal Caché da InterSystems permanece líder mundial permanente em bancos de dados de objetos
