db.session.commit() 使用 sqlalchemy 和 Oracle 时出错

Error on db.session.commit() With sqlachemy and Oracle

我在此处 http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-database 按照 Miguel 的 Flask Mega 教程进行了一些小的修改,因为我使用 Oracle 而不是 sqlite 作为我的数据库。我还使用 flask migrate 而不是 SQLAlchemy-migrate。

这是我的models.py

from app import db

class User(db.Model):

    id = db.Column(db.Integer,db.Sequence('u_id'), primary_key=True)

    nickname = db.Column(db.String(64), index=True, unique=True)

    email = db.Column(db.String(120), index=True, unique=True)

    posts = db.relationship('Post', backref='author', lazy='dynamic')

    def __repr__(self):
        return '<User %r>' % (self.nickname)

class Post(db.Model):

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

    body = db.Column(db.String(140))

    timestamp = db.Column(db.DateTime)

    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    def __repr__(self):
        return '<Post %r>' % (self.body)

根据此处的 sqlachemy 文档 http://docs.sqlalchemy.org/en/latest/dialects/oracle.html,由于 oracle 不支持自动增量,因此我必须指定一个序列。我已经在 id 列定义中完成了。

在 python 提示符下,我可以执行以下操作:

from app import db, models

u = models.User(nickname='john', email='john@email.com')

db.session.add(u)

当我想提交时

db.session.commit()

我收到此错误:

cursor.execute(statement, parameters) sqlalchemy.exc.DatabaseError: (cx_Oracle.DatabaseError) ORA-02289: sequence does not exist [SQL: b'INSERT INTO "user" (id, nickname, email) VALUES (u_id.nextval, :nicknam e, :email) RETURNING "user".id INTO :ret_0'] [parameters: {b'email': 'john@email .com', b'ret_0': None, b'nickname': 'john', 'ret_0': }]

所以基本上就是说序列不存在。我认为 sqlalchemy 实际上会创建序列并使用自动递增值作为唯一 ID。看起来这不会发生。所以我重新开始,这一次,我在数据库上创建 u_id 序列,然后发出

db.session.commit()

再次。当我这样做时,我收到此错误消息:

sqlalchemy.orm.exc.FlushError: Instance has a NULL iden tity key. If this is an auto-generated value, check that the database table all ows generation of new primary key values, and that the mapped Column object is c onfigured to expect these generated values. Ensure also that this flush() is no t occurring at an inappropriate time, such aswithin a load() event.

我尝试使用 sqlite 完成本教程,但我不必处理自动增量。我现在正在使用 Oracle,因为这是我要开发的数据库。如果可以的话请帮忙。谢谢。

这是 cx_oracle 5.2 与 python 3.4.3 一起使用时的错误。当我降到 5.1.3 版本时,一切正常。