使用SQLAlchemy将多个值插入表时是否可以使用数据库函数?
如果我插入一行,以下代码可以正常工作:
conn.execute(
example_table.insert().values(
id=17,
example_field=db.func.concat("foo", "bar")
)
)
字段example_field
包含字符串foobar
。但是,尝试以这种方式插入多行会产生意外结果:
conn.execute(example_table.insert(), [{
"id": 17,
"example_field": db.func.concat("foo", "bar")
}, {
"id": 18,
"example_field": db.func.concat("bar", "baz")
}])
字段example_field
填充了字符串concat(:concat_1, :concat_2)
。
将多行插入带有函数的表中的正确方法是什么?
答案 0 :(得分:1)
这涵盖在"Inserts, Updates and Deletes":
中但是,如果我们希望使用组合表达式明确定位命名参数,我们需要使用
bindparam()
构造。
使用函数调用创建insert语句,但使用bindparam()
构造作为参数:
stmt = example_table.insert().\
values(example_field=func.concat(bindparam('a'), bindparam('b')))
conn.execute(stmt, [
{"id": 17, "a": "foo", "b": "bar"},
{"id": 18, "a": "bar", "b": "baz"}])
concat(:concat_1, :concat_2)
字符串(可能)是您的DB-API驱动程序隐式地将函数表达式对象转换为字符串的结果:
In [5]: str(func.concat("foo", "bar"))
Out[5]: 'concat(:concat_1, :concat_2)'
比较psycopg2错误,因为它不知道如何处理它们。