你似乎有印象的SQLAlchemy只能與工作由SQLAlchemy創建的數據庫結構(可能使用MetaData.create_all()
) - 這是不正確的。 SQLAlchemy可以與預先存在的數據庫完美協作,您只需定義模型以匹配數據庫表。要做到這一點的方法之一是使用反射,如ILJAEverilä提示:
class MyClass(Base):
__table__ = Table('mytable', Base.metadata,
autoload=True, autoload_with=some_engine)
(在我看來,將是一次性的腳本完全正常,但可能會導致非常令人沮喪的錯誤在「真實」應用程序,如果有一個潛在的數據庫結構,可隨時間變化)
另一種方法是簡單地定義你的模型像往常一樣照顧來定義你的模型相匹配的數據庫表,這並不難。這種方法的好處是,您只能將一部分數據庫表映射到您的模型,甚至只能將一部分表列添加到模型的字段中。假設你在數據庫中有10張表,但是從那裏你只需要id
,name
只關心users
表和email
領域:
class User(Base):
id = sa.Column(sa.Integer, primary_key=True)
name = sa.Column(sa.String)
email = sa.Column(sa.String)
(注意,我們怎麼也沒有需要定義的一些細節時,才需要到發出正確的DDL,例如字符串字段的長度或email
字段具有索引的事實)
除非您在代碼中創建或修改模型,否則SQLAlchemy不會發出INSERT/UPDATE查詢。如果你想確保你的查詢是隻讀的,你可以在數據庫中創建一個特殊的用戶,並授予該用戶SELECT權限。另外/另外,您也可以嘗試回滾應用程序代碼中的事務。
你最好使用[反射](http://docs.sqlalchemy.org/en/latest/core/reflection.html),和[automap](http://docs.sqlalchemy.org/en/latest/orm/extensions/automap.html),如果你想使用映射類。 –