Ошибка SqlAlchemy: внешний ключ не может найти таблицу - PullRequest
0 голосов
/ 11 июля 2020

Итак, я создаю приложение и пытаюсь сохранить новые изменения в своей базе данных, но когда я пытаюсь зафиксировать изменения в flask с помощью 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'))

Делаю ли я что-нибудь неправильно при связывании столбца в продуктах с внешним ключом? Это первый раз, когда я сталкиваюсь с этой ошибкой, поэтому я действительно не знаю, что делать прямо сейчас.

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Чтобы исправить, я просто добавил схему в db.ForeignKey, и она сработала

Пример:

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

PS:

Не моя идея. Просто хотел опубликовать ответ на случай, если кто-то позже посетит сообщение с той же проблемой.

Горд Томпсон, спасибо за помощь!

0 голосов
/ 11 июля 2020

Прежде всего, я не вижу никакой таблицы Categories. Во-вторых, вы копируете вставленную схему из таблицы Products в таблицу Countries.

PS: По умолчанию sqlalchemy дает таблицам имя класса (в нижнем регистре). Итак, ваш __tablename__='products' на самом деле ничего не делает.

EDIT:

Проблема с вашим кодом заключается в том, как вы устанавливаете атрибут __table_args__. Вы назначаете ему объект, который по их спецификациям неверен.

Взгляните на следующий пример и соответствующим образом измените свой код

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

Также для получения дополнительной информации см. это https://docs.sqlalchemy.org/en/13/orm/extensions/declarative/table_config.html

...