SQLAlchemy批量插入数据库函数

时间:2018-03-14 21:56:21

标签: python sqlalchemy

使用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)

将多行插入带有函数的表中的正确方法是什么?

1 个答案:

答案 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错误,因为它不知道如何处理它们。