SQLAlchemy не создает определенные столбцы - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь настроить базу данных «многие ко многим» через объект ассоциации (так как мне нужно добавить значение во взаимосвязи).

Я искал по всему стеку Exchange, Google и документация по SQLAlchemy, но я не нашел ни одного подобного экземпляра.

Определения модели (Python3.8):

class Recipe(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    base_id = db.Column(db.Integer, db.ForeignKey('color.id'))
    ingredients = db.relationship('Color',
            backref='recipe',
            cascade='save-update')
    quantity = db.Column(db.Integer)

    def __init__(self, ingredient, quantity):
        print(f'{ingredient=}\n{quantity=}')
        self.ingredients = ingredient
        self.quantity = quantity

    def __repr__(self):
        return f'Recipe({self.ingredients} x{self.quantity})'

class Color(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    medium = db.Column(db.String(2), nullable=False)
    name = db.Column(db.String(50), nullable=False, unique=True)
    pure = db.Column(db.Boolean, default=False, nullable=False)
    _recipe = db.relationship(Recipe,
            primaryjoin=id==Recipe.base_id,
            join_depth=1)
    recipe = association_proxy('_recipe', 'ingredients',
        creator = lambda _: _)
    swatch = db.Column(db.String(25), nullable=False, unique=True)

    def __init__(self, medium, name, pure, *, recipe=None, swatch):
        self.medium = medium.upper()
        self.name = name
        self.pure = pure
        self.swatch = swatch

        if self.pure:
            self.recipe = [Recipe(self, 1)]
        else:
            for ingredient, quantity in recipe:
                self.recipe.append(Recipe(ingredient, quantity))

    def __repr__(self):
        return f'Color({self.name})'

Я использую базу данных SQLite.

Я ожидал бы иметь столбец для каждого атрибута в обеих таблицах, но по какой-то причине это единственный созданный SQL для создания таблицы:

CREATE TABLE color (
        id INTEGER NOT NULL,
        medium VARCHAR(2) NOT NULL,
        name VARCHAR(50) NOT NULL,
        pure BOOLEAN NOT NULL,
        swatch VARCHAR(25) NOT NULL,
        PRIMARY KEY (id),
        UNIQUE (name),
        CHECK (pure IN (0, 1)),
        UNIQUE (swatch)
)

CREATE TABLE recipe (
        id INTEGER NOT NULL,
        base_id INTEGER,
        quantity INTEGER,
        PRIMARY KEY (id),
        FOREIGN KEY(base_id) REFERENCES color (id)
)

Я не получаю ошибок. Если я использую cli для ручного ввода записей, все определенные столбцы сохраняются, хотя и не совсем корректно. Я думаю, что это может быть связано с отсутствующими столбцами, и опубликует его как отдельную проблему, если потребуется, позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...