【问题标题】:how flask-sqlalchemy turn off returning id while insert dataflask-sqlalchemy 如何在插入数据时关闭返回 id
【发布时间】:2019-03-24 09:15:28
【问题描述】:

我正在尝试通过 Flask-SQLAlchemy==2.3.2 将数据插入 PostgreSQL 8.3.23,错误显示 INSERT statement is not supported in this version of Greenplum Database。 那么如何在插入时关闭(flask-)sqlalchemy 中的返回 id。

class BU(db.Model):
    __tablename__ = 'bu'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    bu_code = db.Column(db.String(125), index=True, comment=u'some')
    bu = db.Column(db.String(125), nullable=False, comment=u'some')
    is_game = db.Column(db.Boolean, default=False, comment=u'some')
    status = db.Column(db.Integer, default=0, info={'table_enums': [{'value': 0, 'text': u"some"}, {'value': 1, 'text': u"some"}]})
    add_time = db.Column(db.DateTime, default=datetime.now, comment=u'some')
ipdb> res = BU(bu_code='333', bu='hello')
ipdb> db.session.add(res)
ipdb> db.session.flush()
*** NotSupportedError: (psycopg2.NotSupportedError) The RETURNING clause of the INSERT statement is not supported in this version of Greenplum Database.
 [SQL: 'INSERT INTO bu (bu_code, bu, is_game, status, add_time) VALUES (%(bu_code)s, %(bu)s, %(is_game)s, %(status)s, %(add_time)s) RETURNING bu.id'] [parameters: {'status': 0, 'bu': 'hello', 'is_game': False, 'bu_code': '333', 'add_time': datetime.datetime(2019, 3, 24, 16, 53, 49, 613000)}] (Background on t
his error at: http://sqlalche.me/e/tw8g)

提前致谢

【问题讨论】:

    标签: python sqlalchemy flask-sqlalchemy


    【解决方案1】:

    您需要将implicit_returningcreate_engine参数设置为False

    engine = create_engine(url, implicit_returning=False)
    

    如果为 True,则在没有现有的返回()子句的情况下发出单行 INSERT 语句时,将使用与 RETURNING 兼容的构造(如果可用)来获取新生成的主键值。这适用于那些支持 RETURNING 或兼容结构的后端,包括 PostgreSQL、Firebird、Oracle、Microsoft SQL Server。将此设置为 False 以禁用 RETURNING 的自动使用。

    自 2.4 版以来,Flask-SQLAlchemy 提供了一个SQLALCHEMY_ENGINE_OPTIONS 配置选项来传递关键字参数字典以创建引擎,因此您可以这样做

    app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {'implicit_returning': False}
    

    以下部分适用于 Flask-SQLAlchemy

    Flask-SQLAlchemy 不直接公开引擎创建,可以覆盖SQLAlchemy.apply_driver_hacks 以注入额外参数。

    此方法在引擎创建之前调用,用于将特定于驱动程序的 hack 注入到选项中。 options 参数是关键字参数的字典,然后将用于调用 sqlalchemy.create_engine() 函数。

    有一个出色的pull-request 公开了一种更简单的方法来做到这一点。

    【讨论】:

    猜你喜欢
    • 2020-03-23
    • 2014-03-25
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    相关资源
    最近更新 更多