繁体   English   中英

如何使用SQLAlchemy的'execute'插入JSONB?

[英]How to insert JSONB using SQLAlchemy's 'execute'?

我需要运行一个接受整数和JSONB数据的函数。 在普通控制台中,我将这样运行它:

select my_func(0, '{"foo": "bar"}'::jsonb)

这就是我假设它将在SQLAlchemy中工作的方式:

params = {'p1': 0, 'p2': JSONB('{"foo": "bar"}'))}
result = db.engine.execute(text('select my_func(:p1, :p2)'), params)

但事实并非如此。 我应该如何让SQLAlchemy理解我要插入的JSONB?

JSONB用于定义列的类型,而不处理值。 当使用文本SQL和需要特殊处理的Python或SQL端类型时,请使用TextClause.bindparams()方法提供其他类型信息:

params = { 'p1': 0, 'p2': { "foo": "bar" } }
result = db.engine.execute(
    text('select my_func(:p1, :p2)').bindparams(
        bindparam('p2', type_=JSONB)),
    params)

请注意,您应该传递字典而不自己对其进行序列化。 如果不使用bindparams()提供SQLAlchemy的类型信息,则绑定值会像使用文本SQL一样传递给DB-API游标。 鉴于此,这也应该起作用:

params = {'p1': 0, 'p2': '{"foo": "bar"}'}
result = db.engine.execute(
    text('select my_func(:p1, cast(:p2 as jsonb))'),
    params)

DB-API驱动程序会看到字符串绑定值,并照常进行处理。 SQL中的显式强制转换也可能是多余的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM