Я пытаюсь настроить базу данных «многие ко многим» через объект ассоциации (так как мне нужно добавить значение во взаимосвязи).
Я искал по всему стеку 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 для ручного ввода записей, все определенные столбцы сохраняются, хотя и не совсем корректно. Я думаю, что это может быть связано с отсутствующими столбцами, и опубликует его как отдельную проблему, если потребуется, позже.