【问题标题】:Flask-sqalchemy and oracle database id not autoincrementFlask-sqlalchemy 和 oracle 数据库不是 auto_increment
【发布时间】:2017-05-24 09:31:44
【问题描述】:

我想使用带有 SQLAlchemy 模块的 Python 和 Flask 框架在我的数据库(Oracle 11g 但 Ubuntu 16.04 的 Express 版)中创建一个新表。它和 ID 表的第一个字段是一个整数字段,我希望它自动递增,但 Oracle 数据库不支持自动递增。我有一个添加新评论的表单,但是当我尝试添加新记录时,它会报告错误:

sqlalchemy.exc.IntegrityError: (cx_Oracle.IntegrityError) ORA-01400: cannot insert NULL into ("WIKTOR"."TBL_COMENTARIOS"."ID") [SQL: 'INSERT INTO tbl_comentarios (usuario, comentario, fecha) VALUES (:usuario, :comentario, :fecha) 返回 tbl_comentarios.id 到 :ret_0'] [参数: {'usuario': 'wiktor', 'commentario': 'hola', 'fecha': datetime.datetime(2017, 5 , 24, 11, 23, 45, 39450), 'ret_0': }]

基本上它说 ID 不能为空,这是因为表单中没有添加它的字段,所以它发送 id 为空,然后数据库模型的自动增量不起作用。代码如下:

db = SQLAlchemy()

class Comentarios(db.Model):
    __tablename__ = 'tbl_comentarios'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    usuario = db.Column(db.String(50))
    comentario = db.Column(db.Text())
    fecha = db.Column(db.DateTime, default = datetime.datetime.now)

def __init__(self, usuario, comentario):
    self.usuario = usuario
    self.comentario = comentario

我也试过了:

id = db.Column(db.Integer, primary_key=True)

该代码在 SQL 数据库中确实有效,但在 Oracle 数据库中均无效。

对不起我的英语,我希望有人可以帮助我...... 谢谢!

【问题讨论】:

    标签: python database flask oracle11g flask-sqlalchemy


    【解决方案1】:

    您可以找到here 讨论此问题的 SQLAlchemy 文档。 Oracle 没有自动递增功能,它依赖于序列来模拟行为。

    因此,您的 id 列应如下所示:

    id_seq = Sequence('id_seq')
    id = db.Column(db.Integer, id_seq,
            server_default=id_seq.next_value(), primary_key=True)
    

    【讨论】:

    • 谢谢!我看到了那个页面,但不明白这个想法。我添加了序列('id_seq'),但是我必须创建一个序列?我该怎么做?
    • 检查编辑的代码以获得更清晰的版本,无需在 Oracle 数据库中创建序列即可工作。另请查看this 指南了解更多详情。
    • 谢谢,这可能对我有帮助,但我不明白“metadata=Base.metadata”
    • 元数据是从您的声明库中检索的。由于您使用的是 Flask-SqlAlchemy,因此您可以完全绕过它。
    • 我已经在没有元数据参数的情况下对其进行了测试,它可以工作!更改了我的答案以反映这一点。我不建议直接从应用程序运行自定义 SQL 代码来创建序列,因为这会给以后的迁移带来麻烦。直接用框架做比较好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 2011-04-20
    相关资源
    最近更新 更多