2016-10-10 122 views
4

我正在使用SQLAlchmey作爲一個python項目的ORM。我創建了幾個模型/架構,它工作正常。現在我需要查詢一個現有的mysql數據庫,不需要插入/更新select語句。sqlalchemy現有數據庫查詢

我怎樣才能創建這個現有數據庫的表周圍的包裝?我已經簡要地瀏覽了sqlalchemy文檔,但是卻找不到任何相關的東西。所有建議執行方法,我需要寫入原始SQL查詢,雖然我想使用SQLAlchmey查詢方法與我正在使用SA模型相同的方式。

例如,如果現有的數據庫具有表名用戶,然後我想用dbsession進行查詢(只有選擇操作,可能與加入)

+0

你最好使用[反射](http://docs.sqlalchemy.org/en/latest/core/reflection.html),和[automap](http://docs.sqlalchemy.org/en/latest/orm/extensions/automap.html),如果你想使用映射類。 –

回答

3

你似乎有印象的SQLAlchemy只能與工作由SQLAlchemy創建的數據庫結構(可能使用MetaData.create_all()) - 這是不正確的。 SQLAlchemy可以與預先存在的數據庫完美協作,您只需定義模型以匹配數據庫表。要做到這一點的方法之一是使用反射,如ILJAEverilä提示:

class MyClass(Base): 
    __table__ = Table('mytable', Base.metadata, 
        autoload=True, autoload_with=some_engine) 

(在我看來,將是一次性的腳本完全正常,但可能會導致非常令人沮喪的錯誤在「真實」應用程序,如果有一個潛在的數據庫結構,可隨時間變化)

另一種方法是簡單地定義你的模型像往常一樣照顧來定義你的模型相匹配的數據庫表,這並不難。這種方法的好處是,您只能將一部分數據庫表映射到您的模型,甚至只能將一部分表列添加到模型的字段中。假設你在數據庫中有10張表,但是從那裏你只需要idname只關心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權限。另外/另外,您也可以嘗試回滾應用程序代碼中的事務。

+0

謝謝,雖然我用反射automap,但你的建議也看起來不錯。對於SO用戶,如果您有時間,可以添加Automap的一個示例。這將使這個答案完成 – DevC

+0

@DevC:謝謝,我已經添加了一個例子 – Sergey

0

可以用下面的代碼訪問現有的表:

from sqlalchemy.orm import Session 

Base = automap_base() 
Base.prepare(engine, reflect=True) 
Users = Base.classes.users 
session = Session(engine) 
res = session.query(Users).first()