Pergunta

Atualmente estou avaliando frameworks web com uma camada ORM e eu tropecei em uma questão interessante. Eu usei tabelas com uma coluna de ID em uma aplicação Java EE (EJB3 / JPA) com bancos de dados diferentes. Em SAPDB eu poderia definir uma seqüência e usar o jpa anotação gerador de seqüência de lidar com ele, da mesma forma que eu fiz em um banco de dados oracle anteriormente. Quando eu mudei para SQL Server 2005 de repente eu tive que substituir a coisa toda para uma anotação identidade, porque isso é como SQL Server lida com a geração de ID aparentemente. Eu estava meio desapontado a APP não me deu uma abstração acima disso e eu acho que não é a única limitação que vai se deparar com diferentes bancos de dados.

Agora, para a minha pergunta: Eu li que em web2py por exemplo, todas as tabelas devem ser alteradas para usar um índice auto_increment. Ele suporta geradores de seqüência ou colunas de identidade, bem como? Como sobre os outros frameworks web? Será que vão permitir-me a porta de minha aplicação em vários bancos de dados legados? Ou seja, as definições de tabela são os mesmos, exceto para a coluna de identidade e as pequenas diferenças entre definição de tipo de dados para Cordas (Lembro-me alterar a criar instruções lá, mas eu não consigo lembrar o que exatamente era necessária)

Há também uma diferença na obtenção da ID -. Com o gerador de seqüência que você pode acessar o ID gerado antes da submissão, com auto_increment no MySQL, afaik, você não pode

Foi útil?

Solução

SQLAlchemy pode lidar com ambas as maneiras muito bem. Dada uma declaração de esquema como este:

class Foo(Base):
    id = Column(Integer, Sequence('foo_seq', optional=True), primary_key=True)
    ...

SQLAlchemy irá usar o construída em paradigma auto-incremento da base de dados, se ele tiver um, caso contrário ele irá definir uma seqüência. Ele também gerencia a busca do id gerado, mas como a API é mínimo denominador comum que você obviamente não pode acessá-lo antes da inserção. Você pode ofcourse buscar o id manualmente se você quiser. Por exemplo, para PostgreSQL que tem sequências, mas também tem um tipo de dados serial auto-incremento que é apoiado por seqüências, este irá utilizar o tipo de dados serial. Com versões mais antigas que vai pré-busca automaticamente o valor seguinte sequência para utilização na inserção, com SQLAlchemy 0,6 série e Postgres 8.3+ ele vai usar o recurso INSERT ... RETURNING ... inserir e buscar de uma vez.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top