Vous semblez avoir une impression que SQLAlchemy ne peut fonctionner avec un structure de base de données créée par SQLAlchemy (probablement en utilisant MetaData.create_all()
) - ce n'est pas correct. SQLAlchemy peut parfaitement fonctionner avec une base de données préexistante, il vous suffit de définir vos modèles pour correspondre aux tables de base de données. Une façon de le faire est d'utiliser la réflexion, comme Ilja Everilä suggère:
class MyClass(Base):
__table__ = Table('mytable', Base.metadata,
autoload=True, autoload_with=some_engine)
(qui, à mon avis, serait tout à fait bien pour les scripts ponctuels mais peut conduire à des bugs incroyablement frustrant dans un « vrai » application si la structure de la base de données peut changer au fil du temps)
Une autre façon est de simplement définir vos modèles comme d'habitude en prenant soin de définir vos modèles pour correspondre aux tables de la base de données, ce qui n'est pas si difficile. L'avantage de cette approche est que vous pouvez mapper uniquement un sous-ensemble de tables de base de données à vos modèles et même uniquement un sous-ensemble de colonnes de table aux champs de votre modèle. Supposons que vous avez 10 tables dans la base de données, mais seulement intéressé par users
la table où vous avez seulement besoin id
, name
et email
champs:
class User(Base):
id = sa.Column(sa.Integer, primary_key=True)
name = sa.Column(sa.String)
email = sa.Column(sa.String)
(notez comment on n'a pas besoin de définir certains détails qui ne sont nécessaires pour émet un DDL correct, tel que la longueur des champs String ou le fait que le champ email
a un index)
SQLAlchemy n'émettra pas de requêtes INSERT/UPDATE sauf si vous créez ou modifiez des modèles dans votre code. Si vous souhaitez vous assurer que vos requêtes sont en lecture seule, vous pouvez créer un utilisateur spécial dans la base de données et accorder à cet utilisateur des privilèges SELECT uniquement. Alternativement/en plus, vous pouvez également expérimenter avec l'annulation de la transaction dans votre code d'application.
Vous utiliseriez [réflexion] (http://docs.sqlalchemy.org/en/latest/core/reflection.html), et [automap] (http://docs.sqlalchemy.org/en/latest/orm/extensions/automap.html) si vous voulez travailler avec des classes mappées. –