从别处得到一个数据库,数据库里已经有数据,但是我们不知道具体的表名,就无法用前面的select进行查询。获取数据库的内容 就叫反射。
书上说 反射是利用数据库填充sqlalchemy对象。其实就是像flask时一样,把数据库内容 复制 到cmd的python缓存,然后才能对数据进行操作。
反射 需要 有metadata对象(目录) 来记录保存 被反射(复制)的表,还需要引擎连接到目标数据库。
from sqlalchemy import MetaData, create_engine
metadata = MetaData() #元数据,目录
engine = create_engine('sqlite:///数据库名.sqlite') #引擎
反射整个数据库,看都有什么表
metadata.reflect(bind=engine) #执行成功时不会返回任何内容
print(metadata.tables.keys()) #获取表名列表
输出:
dict_keys(['Album', 'Artist', 'Customer', 'Employee', 'Genre', 'Invoice', 'InvoiceLine', 'Track', 'MediaType', 'Playlist', 'PlaylistTrack'])
反射单个表。有两种方法。法2比较快,不过法2要先反射整个库到metadata
from sqlalchemy import Table
artist = Table('Artist', metadata, autoload=True, autoload_with=engine) #法1
#于是缓存里就有了artist表了,剩下的就是前面的操作
print(artist.columns.keys())
from sqlalchemy import select
s = select([artist]).limit(10)
result = engine.execute(s).fetchall()
for r in result:
print(r)
#...要先反射整个库给metadata
artist = metadata.tables['Artist'] #法2
from sqlalchemy import select
s = select([artist]).limit(10)
result = engine.execute(s).fetchall()
for r in result:
print(r)
用法1对单个表反射,不会把表里的外键也反射出来,因为两个关联表不是同时反射的,所以在建立反射期间 外键的目标不存在。丢失的外键可以自行添加P56,但这样重复地对单个表进行修正太费劲。建议使用法2,直接反射整个库,把外键关系完整地反射出来。
反射表的数据库模式(表的构造)。这行要在cmd里执行才会出现,print不出来。
>>> from sqlalchemy import MetaData, create_engine
>>> metadata = MetaData()
>>> engine = create_engine('sqlite:///Chinook_Sqlite.sqlite')
>>> metadata.reflect(bind=engine)
>>> metadata.tables['Artist']
Table('Artist', MetaData(bind=None), Column('ArtistId', INTEGER(), table=<Artist>, primary_key=True, nullable=False), Column('Name', NVARCHAR(length=120), table=<Artist>), schema=None)
>>> print(metadata.tables['Artist'])
Artist
本文介绍如何使用SQLAlchemy通过反射机制获取数据库表结构及内容。包括整体数据库和单一表的反射方法,以及如何查询反射后的表内容。
313

被折叠的 条评论
为什么被折叠?



