【问题标题】:SqlAlchemy error: Foreign key could not find tableSqlAlchemy 错误:外键找不到表
【发布时间】:2020-11-01 01:51:57
【问题描述】:

所以我正在构建一个应用程序并尝试将新更改保存到我的数据库中,但是当我尝试使用 db.session.commit() 在烧瓶中提交更改时,它会返回以下错误:

sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'products.country_id' could not find table 'countries' with which to generate a foreign key to target column 'id'

在我的 models.py 中,我有以下内容:

from app import db
from . import db

from datetime import datetime

def now():
    return datetime.now()

class Countries(db.Model):
    __tablename__ = 'countries'
    __table_args__ = {'schema': 'products_data'}

    id = db.Column(db.Integer, primary_key=True, unique=True, autoincrement=True)
    name = db.Column(db.String(255))
    code = db.Column(db.String(45))

    def __repr__(self):
        return f'Id {self.id}'

class Categories(db.Model):
    __tablename__ = 'categories'
    __table_args__ = {'schema': 'products_data'}

    id = db.Column(db.Integer, primary_key=True, unique=True, autoincrement=True)
    name = db.Column(db.String(255))

    def __repr__(self):
        return f'Id {self.id}'

class Brands(db.Model):
    __tablename__ = 'brands'
    __table_args__ = {'schema': 'products_data'}

    id = db.Column(db.Integer, primary_key=True, unique=True, autoincrement=True)
    name = db.Column(db.String(255))
    logo = db.Column(db.String(5000))
    feed = db.Column(db.String(5000))
    feed_type = db.Column(db.String(45))
    category_id = db.Column(db.Integer, db.ForeignKey('categories.id'))
    country_id = db.Column(db.Integer, db.ForeignKey('countries.id'))
    awinmid = db.Column(db.Integer)

    def __repr__(self):
        return f'Id {self.id}'

class Products(db.Model):
    __tablename__ = 'products'
    __table_args__ = {'schema': 'products_data'}

    id = db.Column(db.Integer, primary_key=True, unique=True, autoincrement=True)
    name = db.Column(db.String(255))
    url = db.Column(db.Text)
    category_id = db.Column(db.Integer, db.ForeignKey('categories.id'))
    country_id = db.Column(db.Integer, db.ForeignKey('countries.id'))
    price = db.Column(db.Float)
    currency = db.Column(db.String(45))
    discount_price = db.Column(db.Float)
    shipping = db.Column(db.Float)
    brand_id = db.Column(db.Integer, db.ForeignKey('brands.id'))

将产品中的列与外键相关联时我做错了什么吗?这是我第一次遇到这个错误,所以我真的不知道现在该怎么办。

【问题讨论】:

  • 你试过db.ForeignKey('products_data.countries.id')吗?
  • 那行得通。谢谢。如果你想写一个答案,我可以接受它

标签: mysql flask sqlalchemy foreign-keys flask-sqlalchemy


【解决方案1】:

为了解决这个问题,我刚刚将架构添加到 db.ForeignKey 并且它起作用了

例子:

db.ForeignKey('products_data.countries.id')

PS:

不是我的主意。只是想发布答案,以防以后有人访问该帖子时遇到同样的问题。

戈德汤普森感谢您的帮助!

【讨论】:

    【解决方案2】:

    首先,我没有看到任何表格Categories。其次,将 Products 表中的架构复制粘贴到 Countries 表中。

    PS:默认情况下,sqlalchemy 为表提供类的名称(小写)。所以你的__tablename__='products' 实际上什么也没做。

    编辑:

    您的代码的问题在于您如何设置__table_args__ 属性。您为其分配了一个对象,根据他们的规范,这是错误的。

    查看以下示例并相应地修改您的代码

    __table_args__ = ({'schema': 'products_data'})
    

    也为了进一步参考,看看这个https://docs.sqlalchemy.org/en/13/orm/extensions/declarative/table_config.html

    【讨论】:

    • 在数据库中有它,但在模型中没有,但仍然是同样的错误。
    • 删除categories 表的外键并运行它。看看它是否有效,如果有效,那么您的问题与该表有关
    • 当您创建Countries 表时,您是否使用flask db migrate -m 'sth'db.create_all() 命令将其“提交”到您的数据库中?
    • 您的脚本中可能有模型,但 .db 文件中没有
    • 我删除了它,显然它对每个外键都给出了错误。
    猜你喜欢
    • 2019-11-05
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 2018-02-19
    • 2022-12-21
    • 1970-01-01
    相关资源
    最近更新 更多