sqlalchemy 5 反射

本文介绍如何使用SQLAlchemy通过反射机制获取数据库表结构及内容。包括整体数据库和单一表的反射方法,以及如何查询反射后的表内容。

从别处得到一个数据库,数据库里已经有数据,但是我们不知道具体的名,就无法用前面的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值