48 votes

Dois-je créer des objets de mappage ou utiliser la syntaxe déclarative dans SQLAlchemy?

Il y a deux (trois, mais je ne suis pas de comptage de l'Elixir, qu'il ne soit pas "officiel") façons de définir une persistance de l'objet avec SQLAlchemy:

Explicite de la syntaxe pour mapper des objets

from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
from sqlalchemy.orm import mapper

metadata = MetaData()

users_table = Table('users', metadata,
    Column('id', Integer, primary_key=True),
    Column('name', String),
)

class User(object):
    def __init__(self, name):
        self.name = name

    def __repr__(self):
       return "<User('%s')>" % (self.name)

mapper(User, users_table) # &lt;Mapper at 0x...; User&gt;

Syntaxe déclarative

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

class User(Base):
     __tablename__ = 'users'
     id = Column(Integer, primary_key=True)
     name = Column(String)

     def __init__(self, name):
         self.name = name

     def __repr__(self):
         return "<User('%s')>" % (self.name)

Je vois que tout en utilisant les objets mappeur, je me sépare complètement l'ORM définition de la logique d'entreprise, tout en utilisant la syntaxe déclarative, à chaque fois que je modifie la logique de classes, je peux modifier la droite là la base de données de la classe (qui idéalement devrait être édité peu).

Ce que je ne suis pas complètement sûr, est l'approche qui est plus facile à gérer pour une application d'entreprise?

Je n'ai pas été en mesure de trouver un comparatif entre les deux méthodes de cartographie, pour être en mesure de décider ce qui est mieux à mon projet.

Je suis penchée vers l'utilisation de la voie "normale" (c'est à dire de ne pas le déclaratif de l'extension), car il me permet de "cacher", et gardez-le hors de la vue d'entreprise tous les ORM logique, mais j'aimerais entendre des arguments convaincants pour les deux approches.

25voto

S.Lott Points 207588

"Ce que je ne suis pas complètement sûr, est l'approche qui est plus facile à gérer pour une application d'entreprise?"

Ne peuvent pas être répondues en général.

Cependant, considérez ceci.

L'ORM de Django est strictement déclarative et les gens comme ça.

SQLAlchemy n'plusieurs choses, qui ne sont pas toutes pertinentes pour tous les problèmes.

  1. SQLAlchemy crée DB SQL spécifique à partir d'usage général Python. Si vous voulez mess avec le SQL, ou de la carte de classes Python à des tables existantes, alors vous devez utiliser les mappages explicites, parce que votre accent est mis sur le SQL, pas les objets métiers et de l'ORM.

  2. SQLAlchemy pouvez utiliser déclaratif de style (comme Django) pour créer tout pour vous. Si vous voulez, puis vous donnez explicitement écrit les définitions de table et explicitement, de jouer avec le SQL.

  3. Elixir est une alternative pour vous éviter d'avoir à regarder SQL.

La question fondamentale est "voulez-vous voir et de toucher le SQL?"

Si vous pensez que le toucher de la SQL rend les choses plus "gérables", alors vous devez utiliser les mappages explicites.

Si vous pensez que le fait de dissimuler le SQL rend les choses plus "gérables", alors vous devez utiliser l'ensemble des déclarations de style.

  • Si vous pensez que Élixir peut diverger de SQLAlchemy, ou ne parviennent pas à se montrer à la hauteur de la promesse d'une certaine façon, alors ne l'utilisez pas.

  • Si vous pensez que l'Élixir va vous aider à l'utiliser.

16voto

Pavel Repin Points 13751

Dans notre équipe, nous nous sommes installés sur la syntaxe déclarative.

Justification:

  • metadata est trivial pour obtenir, si nécessaire: User.metadata.
  • Votre User classe, en vertu du sous-classement Base, a une belle ctor qui prend kwargs pour tous les champs. Utile pour les tests et le contraire. E. g.: user=User(name='doe', password='42'). Donc pas besoin d'écrire un ctor!
  • Si vous ajoutez un attribut/colonne, vous ne devez le faire qu'une fois. "Don't Repeat Yourself" est un beau principe.

Quant à "garder hors de l'ORM de vue d'entreprise": en réalité, votre User classe, défini d'une façon "normale", est sérieusement singe-patché par SA lors de l' mapper fonction a son chemin avec elle. À mon humble avis, déclarative de façon plus honnête, car il hurle: "cette classe est utilisée dans ORM scénarios, et ne peuvent pas être traités de la même façon que vous traitez votre simple non-ORM objets".

6voto

abbot Points 8093

J'ai trouvé que l'utilisation de mapper les objets sont beaucoup plus simple syntaxe déclarative si vous utilisez sqlalchemy-migrer à la version de votre schéma de base de données (et c'est un must-have pour une application d'entreprise de mon point de vue). Si vous êtes à l'aide de mapper les objets que vous pouvez simplement copier/coller de votre table de déclarations à la migration de versions, et l'utilisation simple api pour modifier les tables dans la base de données. Syntaxe déclarative rend plus difficile parce que vous devez filtre toutes les fonctions d'assistance de vos définitions de classe après la copie à la migration de la version.

Aussi, il me semble que les relations complexes entre les tableaux sont exprimés plus clairement avec mapper les objets de la syntaxe, mais cela peut être subjectif.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X