gpt4 book ai didi

python-3.x - 使用 sqlalchemy 和 Oracle 时 db.session.commit() 出错

转载 作者:行者123 更新时间:2023-12-03 16:12:07 26 4
gpt4 key购买 nike

我在这里关注 Miguel 的 Flask Mega 教程 http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-database使用 Oracle 而不是 sqlite 作为我的数据库只是一个小的修改。我还使用 flask migrate 而不是 SQLAlchemy-migrate。

这是我的模型.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 版本时,一切正常。

关于python-3.x - 使用 sqlalchemy 和 Oracle 时 db.session.commit() 出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31332307/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com