2015-07-10 188 views
3

我正在跟随由Miguel在这里http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-database Flask Mega教程只是一个小的修改,因为使用Oracle而不是sqlite作为我的数据库。我也使用了flask迁移而不是SQLAlchemy-migrate。错误db.session.commit()与sqlachemy和Oracle

这是我的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) 

根据这里http://docs.sqlalchemy.org/en/latest/dialects/oracle.html的的sqlachemy文档,因为Oracle不支持自动增量,我必须指定一个序列。我已经在id列定义中做到了。

蟒提示,我能够做到:

from app import db, models 

u = models.User(nickname='john', email='[email protected]') 

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': '[email protected] .com', b'ret_0': None, b'nickname': 'john', 'ret_0': }]

所以基本上它说这个序列不存在。我认为sqlalchemy实际上会创建序列并使用自动增量值作为唯一的id。看起来好像没有发生。所以我重新开始,这一次,我在数据库上创建了u_id序列,然后再次发布了

。当我这样做,我收到此错误信息:

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,因为这是我将开发的数据库。如果可以的话请帮忙。谢谢。

+0

不是我认为它很重要,但'id = db.Column(...' –

+0

@hiroprotagonist我删除了',')的arg-list结尾处有一个额外的','。不是我的问题的原因 – okyere

+0

事实证明,cx_oracle是罪魁祸首。当我遇到这个问题时,我安装了5.2版本(最新版本)。我决定删除以前的版本(5.1.3),它工作正常在后来的项目中,我决定切换到python 2.7.10,即使使用cx_oracle 5.2也是如此。因此python 3.4.3的一些东西在cx_oracle 5.2中并没有很好的表现。 – okyere

回答

0

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