flask-sqlalchemy如何关闭在插入数据时返回ID

时间:2019-03-24 09:15:28

标签: python sqlalchemy flask-sqlalchemy

我试图通过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)

预先感谢

1 个答案:

答案 0 :(得分:1)

您需要将implicit_returning create_engine参数设置为False

engine = create_engine(url, implicit_returning=False)
  

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

Flask-SSQLAlchemy不会直接公开引擎的创建,可能可以重写SQLAlchemy.apply_driver_hacks来注入额外的参数。

  

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

有一个出色的pull-request公开了一种更简单的方法。