【问题标题】:Flask-Migration with one-to-many relationship具有一对多关系的 Flask-Migration
【发布时间】:2018-07-28 17:11:23
【问题描述】:

我有一个有效的博客系统。我想将它添加到评论系统。我使用带有 id、title 和 body 的 post 模型完成了迁移。

现在我添加 cmets 并创建名为 Comment 的新模型。当我运行迁移时:

INFO [alembic.runtime.migration] Context impl MySQLImpl.

INFO [alembic.runtime.migration] 将采用非事务性 DDL。

INFO [alembic.env] 未检测到架构更改。

from run import db

class Post(db.Model):
    __tablename__ = 'blog.post'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String, nullable=False)
    body = db.Column(db.Text, nullable=False)

    comments = db.relationship('Comment', backref='blog.post')


from run import db


class Comment(db.Model):   
    __tablename__ = 'blog.comment'
    id = db.Column(db.Integer, primary_key=True)
    body = db.Column(db.Text, nullable=False)

    post_id = db.Column(db.Integer, db.ForeignKey('blog.post.id'), nullable=False)

我不知道我的代码有什么问题。我从文档中获取关系并对其进行编辑。 db中没有评论表。

编辑 1: 我在运行中调用评论,如下所示: from model.comment 导入评论

之后我可以创建迁移,但迁移出现如下错误:

sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1005, 'Can\'t create table blog_db.blog.comment (errno: 150 "外键约束格式不正确")') [SQL : '\nCREATE TABLE blog.comment (\n\tid INTEGER NOT NULL AUTO_INCREMENT, \n\tname VARCHAR(255) NOT NULL, \n\tbody TEXT NOT NULL, \n\tcreated DATETIME DEFAULT now(), \n\ tstatus INTEGER NOT NULL, \n\tpost_id INTEGER NOT NULL, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(post_id) REFERENCES blog.post (id)\n)\n\n'] (背景错误:http://sqlalche.me/e/2j85)

【问题讨论】:

  • 该代码是否在 2 个单独的模块中?都是进口的吗?你是手动调用 db.create_all() 吗?
  • 您应该在某处显式导入Comment
  • 它们在同一个模块中。我不在任何地方调用 db.create_all() 。我编辑我的主题

标签: python flask flask-sqlalchemy flask-migrate sqlalchemy-migrate


【解决方案1】:

错误Foreign key constraint is incorrectly formed的发生是因为主键和外键的类型不同。

Post 模型中,您将id 列定义为:

id = db.Column(db.Integer, primary_key=True)

但是您在Comment 模型中添加的post_id 外键定义不同:

post_id = db.Column(db.Integer, db.ForeignKey('blog.post.id'), nullable=False)

我认为如果您从外键中删除 nullable 子句,您将接受迁移。

【讨论】:

    猜你喜欢
    • 2015-05-24
    • 2019-08-08
    • 2016-06-15
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    相关资源
    最近更新 更多