Essential SQLAlchemy 2 th学習ノートの反射Reflection

2277 ワード

サンプルデータベースのダウンロード:http://chinookdatabase.codepl...SQLALchemyでは、反射技術を使って、tables、view、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() #       
注意:SQLAlchemy 1.0バージョンから、私たちは反射によってCheckContrants、comments、or triggers.You also can't reflect-client-side defaults or an assiociation between a sequence and a columnを取得できません。
反射オブジェクトに基づいてクエリーを行います。
playlist = metadata.tables['Playlist']
from sqlalchemy import select
s = select([playlist]).limit(10)
engine.execute(s).fetchall()
ORMモジュール反射
Refreecting a Database with Automap
ここでは私達はdeclarate_を使いません。ベースではなく拡張モジュールを使用したautmap_ベース
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 Relationsipsの反射関係
Automapは表の間のmany-to-oneを反射して確立することができます。one-to-many、and many-to-many relationsips。しかし、関連する列を作ることは「related_」と名づけられました。objectコレクションは、例えば、
artist = session.query(Artist).first()
for album in artist.album_collection:
    print('{} - {}'.format(artist.Name, album.Title))
Automapに関する詳細は公式文書を参照してください。