我想使用SQLAlchemy在PostgreSQL数据库中创建一个视图。我正在使用sqlalchemy-views中的CreateView编译器。我使用这个问题的答案作为参考:
How to create an SQL View with SQLAlchemy?
我创建视图的代码如下所示:
def create_view(self, myparameter):
mytable = Table('mytable', metadata, autoload=True)
myview = Table('myview', metadata)
engine.execute(CreateView(myview, mytable.select().where(mytable.c.mycolumn==myparameter)))
但是,当我尝试运行此查询时,会抛出以下异常:
KeyError: 'mycolumn_1'
查看已编译的查询,似乎没有替换我的参数值的占位符:
'\nCREATE VIEW myview AS SELECT mytable.mycolumn \nFROM mytable \nWHERE mytable.mycolumn = %(mycolumn_1)s\n\n'
由于占位符未被替换,查询显然失败。但是,我不明白为什么替换不会发生,因为我的代码与示例没什么不同。
我的第一个怀疑是参数的类型和列可能不兼容。目前,该参数以unicode字符串形式出现,该字符串应映射到数据库中的文本列。我还尝试将参数作为long映射到bigint列,并使用相同(失败)的结果。
有没有人有其他建议?
答案 0 :(得分:0)
从SQLAlchemy文档中,我可以看到,当想要传递最终将在表达式时使用的实际值时,bindparam()
为used。还提供了一个很好的例子:
from sqlalchemy import bindparam
stmt = select([users_table]).\
where(users_table.c.name == bindparam('username'))