V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
scarlex
V2EX  ›  Python

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

  •  
  •   scarlex ·
    scarletsky · 2013-04-01 15:31:54 +08:00 · 5380 次点击
    这是一个创建于 4041 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在做一个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的视图中创建新的记录完全没问题啊。。
    5 条回复    1970-01-01 08:00:00 +08:00
    binux
        1
    binux  
       2013-04-01 15:43:24 +08:00
    category_id是一个int,你传一个对象给它干嘛?
    scarlex
        2
    scarlex  
    OP
       2013-04-01 15:57:58 +08:00
    @binux
    我看教程好像也是传值的..?

    教程:
    u = models.User(nickname='susan', email='[email protected]')
    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
        3
    Catstyle  
       2013-04-01 16:19:36 +08:00   ❤️ 1
    @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
        4
    binux  
       2013-04-01 16:19:42 +08:00   ❤️ 1
    @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
        5
    scarlex  
    OP
       2013-04-01 16:44:27 +08:00
    @binux
    @Catstyle
    眼残了...确实要认真读读sqlalchemy的文档呢...
    感谢两位
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1047 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:22 · PVG 06:22 · LAX 15:22 · JFK 18:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.