【问题标题】:With SQLAlchemy metadata reflect() how do you get an actual table object?使用 SQLAlchemy 元数据 reflect() 如何获得实际的表对象?
【发布时间】:2016-12-17 10:03:33
【问题描述】:

我只是在现有数据库上进行一系列选择。

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

我需要获取一个 Table 对象,所以我执行以下操作:

 s = select([some_table_object])

我已经想出了如何显式反映单个表以获取表对象:

from sqlalchemy import *

conn = create_engine('mysql://....')
metadata = MetaData(conn)
mytable = Table('mytable', metadata, 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 实例?

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

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

    mytable = metadata.tables['mytable']
    

    更多信息请参见"Reflecting All Tables At Once"

    【讨论】:

    • 这比预期的要简单。
    • 在使用metadata.reflect(views=True)时有没有办法查询或过滤视图?
    【解决方案2】:

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

    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

    【讨论】:

      猜你喜欢
      • 2014-01-06
      • 2012-07-18
      • 1970-01-01
      • 2022-01-03
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多