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

时间:2015-07-10 04:11:23

标签: python-3.x oracle11g flask sqlalchemy flask-sqlalchemy

我跟随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,因为那是我正在开发的数据库。如果可以的话请帮忙。感谢。

1 个答案:

答案 0 :(得分:0)

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