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 版本时,一切正常。
我在此处 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 版本时,一切正常。