摘要:基于反射對象進行查詢模塊反射這里我們不再使用而是使用擴展模塊的獲取所有的對象名獲取表對象進行操作反射關聯關系可以反射并建立表之間的但是建立關聯列的命名為例如關于更多信息請詳細參看官方文檔
示例數據庫下載:http://chinookdatabase.codepl...
在SQLALchemy中,我們使用反射技術來獲取相關database schema信息,如tables,views,indexes等等
from sqlalchemy import MetaData, create_engine metadata = MetaData() engine = create_engine("sqlite:///Chinook_Sqlite.sqlite") from sqlalchemy import Table #這里我們并沒有使用Column來定義列,而是使用autoload,autoload_with參數來從已有數據表中反射出相關列定義。 artist = Table("Artist", metadata, autoload=True, autoload_with=engine) #接下來使用反射出來的表對象進行相關查詢 artist.columns.keys() #列出所有的列名 from sqlalchemy import select s = select([artist]).limit(10) engine.execute(s).fetchall() #metadata.tables["Artist"] #artist.foreign_keys #from sqlalchemy import ForeignKeyConstraint #album.append_constraint(ForeignKeyConstraint(["ArtistId"], ["artist.ArtistId"])) #str(artist.join(album))反射整個數據庫
#使用reflect()方法,它不會返回任何值 metadata.reflect(bind=engine) #但是我們仍然可以進行相關檢索 metadata.tables.keys() #獲取所有的表名
注意:從SQLAlchemy1.0版本開始,我們不能通過反射獲取CheckConstraints, comments, or triggers.You also can’t reflect client-side defaults or an association between a sequence and a column.(這意味著我們會失去注釋,或者表關聯關系)但是我們可以通過相關方法或函數手動添加它們。
基于反射對象進行查詢playlist = metadata.tables["Playlist"] from sqlalchemy import select s = select([playlist]).limit(10) engine.execute(s).fetchall()ORM模塊反射 Reflecting a Database with Automap
這里我們不再使用declarative_base而是使用擴展模塊的automap_base
from sqlalchemy.ext.automap import automap_base Base = automap_base() from sqlalchemy import create_engine engine = create_engine("sqlite:///Chinook_Sqlite.sqlite") Base.prepare(engine, reflect=True) Base.classes.keys() #獲取所有的對象名 #獲取表對象 Artist = Base.classes.Artist Album = Base.classes.Album #進行操作 from sqlalchemy.orm import Session session = Session(engine) for artist in session.query(Artist).limit(10): print(artist.ArtistId, artist.Name)Reflected Relationships反射關聯關系
Automap可以反射并建立表之間的many-to-one, one-to-many, and many-to-many relationships.
但是建立關聯列的命名為< related_object>_collection例如:
artist = session.query(Artist).first() for album in artist.album_collection: print("{} - {}".format(artist.Name, album.Title))
關于Automap更多信息請詳細參看官方文檔
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38264.html
摘要:支持從現有數據庫自動生成代碼,并支持一對多,一對一,多對多的關聯關系。生成整個庫的代碼指定表保存到指定文件 pip install sqlacodegen sqlacodegen支持從現有數據庫自動生成ORM代碼,并支持一對多,一對一,多對多的關聯關系。 #生成整個庫的代碼 sqlacodegen sqlite:///Chinook_Sqlite.sqlite #指定表 sqlacod...
摘要:默認的可以增量式創建數據庫缺失的表,但是無法做到修改已有的表結構,或刪除代碼中已經移除的表。這個時候我們就需要用到這個庫。 SQLAlchemy默認的create_all()可以增量式創建數據庫缺失的表,但是無法做到修改已有的表結構,或刪除代碼中已經移除的表。這個時候我們就需要用到Alembic這個SQLAlchemy migrations庫。安裝:pip install alembi...
摘要:你應該使用工廠類來創建類,因為這確保了配置參數的正確性。對象包含創建數據庫連接所需的一切信息,它不會立即創建連接對象,而是會在我們進行具體操作時創建。注意生產環境不要使用這個選項。關于選擇的最佳實踐使用迭代方式獲取所有值,而不是。 定義模式Defining Schema 定義ORM類的4個步驟: 繼承declarative_base()函數返回的類 定義__tablename__屬性...
摘要:說明中經常使用的反射特性來設計代碼,本文主要學習的反射特性,來提高寫代碼時的設計質量。提供一套檢測的兩個工具包和,類似于探針一樣的東西來探測這些一等公民。限于篇幅,下篇再聊下反射。 說明:Laravel中經常使用PHP的反射特性來設計代碼,本文主要學習PHP的反射特性,來提高寫代碼時的設計質量。PHP提供一套檢測class, interface, trait, property, me...
摘要:方法與代理處理程序的方法相同。使用給目標函數傳入指定的參數。當然,不用反射也可以讀取的值。的例子我們可以理解成是攔截了方法,然后傳入參數,將返回值賦值給,這樣我們就能在需要讀取這個返回值的時候調用。這種代理模式和的代理有異曲同工之妙。 反射 Reflect 當你見到一個新的API,不明白的時候,就在瀏覽器打印出來看看它的樣子。 showImg(https://segmentfault....
閱讀 1049·2021-11-25 09:43
閱讀 1418·2021-11-18 10:02
閱讀 1862·2021-11-02 14:41
閱讀 2373·2019-08-30 15:55
閱讀 1078·2019-08-29 16:18
閱讀 2562·2019-08-29 14:15
閱讀 1395·2019-08-26 18:13
閱讀 741·2019-08-26 10:27