创建视图时的KeyError

时间:2017-12-13 10:28:44

标签: python postgresql sqlalchemy

我想使用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列,并使用相同(失败)的结果。

有没有人有其他建议?

1 个答案:

答案 0 :(得分:0)

从SQLAlchemy文档中,我可以看到,当想要传递最终将在表达式时使用的实际值时,bindparam()used。还提供了一个很好的例子:

from sqlalchemy import bindparam

stmt = select([users_table]).\
            where(users_table.c.name == bindparam('username'))