sqlalchemy / postgres:在运行时参数化查询中的列名?

时间:2017-07-17 18:04:49

标签: sql postgresql dynamic sqlalchemy

我有一个sqlalchemy / postgres查询,运行方式如下(示例代码):

start = # a datetime value
end   = # a datetime value
engine = # the definition of an engine
table = Table('table_name', ... etc. ...)
query = select(['*'])
results = engine.connect().execute(query).where(between(table.c.some_column, start, end))

这很简单直接。但是,事实证明我想要使用不同的表名和不同的列名重用此代码,这两个名称都在配置文件中指定为字符串。

例如,假设表" xyz"包含一个名为" the_timestamp"的列,并假设表" abc"包含一个名为" the_time"的列。我联想" xyz"用" the_timestamp"在配置文件中并关联" abc"用" the_time"在配置文件中。然后,根据从配置文件中选择的表/列组合,where子句将使用" the_timestamp"如果表是" xyz"和" the_time"如果表是" abc"。

显然,这部分表格是微不足道的,因为Table()函数将字符串作为参数。但是,where子句中的列名不是字符串,而是对sqlalchemy对象的引用。我希望将where子句中的列名动态设置为配置文件中的列名字符串,而不是使用预定义的对象作为列的名称。

我还没有找到如何在sqlalchemy中做到这一点。谢谢你的建议。

1 个答案:

答案 0 :(得分:2)

您需要动态定义和访问表和列。您可能希望使用tablecolumn代替TableColumn,这样您就不需要注意从{{{}}中移除这些动态创建的对象{1}}。所以:

MetaData

要动态使用这些内容,请使用getattr

t = table(table_name, column(col_name1), column(col_name2), ...)