使用SQLAlchemy元数据reflect()如何获得实际的表对象?

时间:2016-08-10 20:48:39

标签: python sqlalchemy

我只是在现有数据库上做了很多选择。

  • 不要使用原始SQL,因为我可能想在mysql和sqlite之间跳转进行测试
  • 希望坚持使用SQLAlchemy的SQL表达式语言。

我需要获取一个Table对象,所以我做了类似

的操作
 s = select([some_table_object])

我已经想过如何明确地反映单个表来获取表对象:

from sqlalchemy import *

conn = create_engine('mysql://....')
metadata = MetaData(conn)
mytable = Table('mytable', meta, autoload=True)

s = select([mytable])
result = conn.execute(s)

# HAPPY!!!!

但是,这对于每个表都必须这样做很繁琐(我会去很多表)。我知道我可以以某种方式使用MetaData类来反映我连接的现有数据库,但我不确定如何从元数据中获取实际的相应表。

from sqlalchemy import *

conn = create_engine('mysql://....')

metadata = MetaData(conn)
metadata.reflect()

# How would do I get a Table instance corresponding to the 
# mytable table in the DB so I move on to HAPPY!!

mytable = metadata.no_clue_how_to_get_tables()

s = select([some_table_object])
result = conn.execute(s)

替换行mytable = metadata.no_clue_how_to_get_tables()以获取Table个实例需要什么?

2 个答案:

答案 0 :(得分:6)

就像从元数据对象的表字典中查找表一样简单:

mytable = metadata.tables['mytable']

有关详细信息,请参阅"Reflecting All Tables At Once"

答案 1 :(得分:1)

如果不确定最初存在哪些表,可以执行此查询以检查数据库表。

from sqlalchemy import create_engine
from sqlalchemy.engine import reflection

# Create connection string & engine
connection_string = "sql_connection_string"
engine = create_engine(connection_string, echo=False)

# Performs database schema inspection
insp = reflection.Inspector.from_engine(engine)
print(insp.get_table_names())

然后,您可以像上面的回答状态一样从表中选择元数据。

Inspector.get_table_names()返回特定模式内引用的所有表名。这不会返回视图。而是使用Inspector.get_view_names()方法返回视图。 Docs