使用SQLAlchemy 时,如果数据库中已有表,我们可以不需要创建新表,通过映射,使用已存在的表.
反射可以应用到表,视图,索引和外键上。
1:创建元数据和引擎,他们是反射一个表所需要的一切
"""
This module is to test sqlalchemy core reflect
"""
from sqlalchemy import MetaData, create_engine
from sqlalchemy import Table, select
# 创建一个引擎连接到 my database 'ANNEDBSE'
engine = create_engine('mysql+pymysql://userid:password@123.123.14.56:3306/ANNEDBSE?charset=utf8')
# 创建一个元数据对象来保存被反射的表模式信息
metadata = MetaData()
2:第一种方法反射表
# 方法一,使用autoload和autoload_with,把模式信息反射到metadata对象中,并在新变量
# my_cookies中保存对表的引用
my_cookies = Table('cookies', metadata, autoload=True, autoload_with=engine)
# 上面一行代码已经把现有表cookies里的信息反射到新表my_cookies,现在可以使用新表了
# 查看新表的各个column,并打印出来看看
k = my_cookies.columns.keys()
print(k)
# 选出新表前10行信息,并打印
s = select([my_cookies]).limit(10)
for result in engine.execute(s).fetchall():
print(result)
3:第二种方法使用metadata对象的reflect方法,反射整个数据库。reflect会扫描引擎上的所有可用内容,并反射它所能反射的所有内容。
# 方法二,反射整个现有数据库
print('Next we will use metadata and engine to reflect the whole database')
metadata.reflect(bind=engine)
k = metadata.tables.keys() # get the tables list
print(k)
4:第三种方法使用反射对象构建查询
print('Next we will use metadat.tables')
my_line_items = metadata.tables['line_items']
s = select([my_line_items])
results = engine.execute(s).fetchall()
for result in results:
print(result)