我跟随Miguel的Flask Mega Tutorial http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-database进行了一些小的修改,比如使用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:序列不存在[SQL: b&#39; INSERT INTO&#34;用户&#34; (id,昵称,电子邮件)VALUES(u_id.nextval, :nicknam e,:email)RETURNING&#34; user&#34; .id INTO:ret_0&#39;] [参数: {b&#39;电子邮件&#39;:&#39; john @ email .com&#39;,b&#39; ret_0&#39;:无,b&#39;昵称&#39;:&#39; john&#39; ;, &#39; ret_0&#39;:}]
所以基本上它说的是序列不存在。我认为sqlalchemy实际上会创建序列并使用自动增量值作为唯一ID。看起来并没有发生。所以我重新开始,这次,我在数据库上创建了u_id序列,然后发布了
db.session.commit()
一次。当我这样做时,我收到此错误消息:
sqlalchemy.orm.exc.FlushError:实例有一个 NULL标识密钥。如果这是自动生成的值,请检查 数据库表全部生成新的主键值,和 映射的Column对象被配置为期望生成这些对象 值。还要确保在此处没有发生此flush() 不适当的时间,例如在load()事件中。
我尝试用sqlite做这个教程,我没有必要处理自动增量。我现在正在使用Oracle,因为那是我正在开发的数据库。如果可以的话请帮忙。感谢。
答案 0 :(得分:0)
这是cx_oracle 5.2使用python 3.4.3的错误。当我下载到5.1.3版本时,一切正常。