Flask中用db.session.commit()引发sqlalchemy.exc.IntegrityError错误?

2013-04-01 15:31:54 +08:00
 scarlex
在做一个blog,models.py是这样的。

class Category(db.Model):
----id = db.Column(db.Integer, primary_key=True)
----category = db.Column(db.String(80))
----posts = db.relationship('Post', backref="posts", lazy="dynamic")

----def __repr__(self):
--------return "<Category %s>" % self.category

class Post(db.Model):
----id = db.Column(db.Integer, primary_key=True)
----title = db.Column(db.String(120))
----content = db.Column(db.Text)
----timestamp = db.Column(db.DateTime)
----category_id = db.Column(db.Integer, db.ForeignKey('category.id'))

----def __repr__(self):
--------return "<Post %s>" % self.title

在shell里面执行
>>> c=Category(category='flask')
>>> p=Post(title='test', content='ccc', timestamp=datetime.utcnow(), category_id=c)
>>> db.session.add(c)
>>> db.session.add(p)
>>> db.session.commit()

然后就引发了这个错误了。。
实在搞不懂为什么会引发这个错误。。。
奇怪的是,在Flask-admin的视图中创建新的记录完全没问题啊。。
5387 次点击
所在节点    Python
5 条回复
binux
2013-04-01 15:43:24 +08:00
category_id是一个int,你传一个对象给它干嘛?
scarlex
2013-04-01 15:57:58 +08:00
@binux
我看教程好像也是传值的..?

教程:
u = models.User(nickname='susan', email='susan@email.com')
p = models.Post(body='my first post!', timestamp=datetime.datetime.utcnow(), author=u)

教程的表示这样的:
class User(db.Model):
--id = db.Column(db.Integer, primary_key = True)
--nickname = db.Column(db.String(64), unique = True)
--email = db.Column(db.String(120), unique = True)
--posts = db.relationship('Post', backref = 'author', lazy = 'dynamic')

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'))
Catstyle
2013-04-01 16:19:36 +08:00
@scarlex
----posts = db.relationship('Post', backref="posts", lazy="dynamic")
你这里错了,这个表达的是你通过Post的实例访问‘backref’能反射到自己
意思就是说p.backref == c
所以你这里应该是
----posts = db.relationship('Post', backref="category", lazy="dynamic")
p=Post(title='test', content='ccc', timestamp=datetime.utcnow(), category=c)
然后p.category就是这个c实例
binux
2013-04-01 16:19:42 +08:00
@scarlex
你注意看
db.relationship('Post', backref = 'author', lazy = 'dynamic')
这一句,对于Post->User的relationship有一个反向的引用,author,所以这里可以用author=u
而你的Model是
db.relationship('Post', backref="posts", lazy="dynamic")

而且 author=u 也不是给 user_id 赋值

建议去读sqlalchemy的文档
scarlex
2013-04-01 16:44:27 +08:00
@binux
@Catstyle
眼残了...确实要认真读读sqlalchemy的文档呢...
感谢两位

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/64658

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX