【问题标题】:SQLalchemy table with multiple foreign keys from other tables [duplicate]具有来自其他表的多个外键的 SQLalchemy 表[重复]
【发布时间】:2019-02-18 18:41:18
【问题描述】:

我正在尝试学习sqlalchemy,并且对创建一个对象感到有点困惑,该对象将进入一个具有其他两个表的外键的表。这是我正在尝试做的一个简单示例。我正在创建一个食谱数据库并拥有三个表:recipesingredientsrecipe_ingredientsrecipe_ingredients 将成分与食谱链接在一起。我有这个积累:

from sqlalchemy import create_engine, Column, Integer, Text, ForeignKey
from sqlalchemy.orm import relationship, scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine(u'sqlite:///:memory:', echo=True)
session = scoped_session(sessionmaker(bind=engine))
Base = declarative_base()

class Recipe(Base):
    __tablename__ = 'recipes'
    id = Column(Integer, primary_key=True)
    name = Column(Text)

    recipe_ingredient = relationship('RecipeIngredient', back_populates='recipe')

class Ingredient(Base):
    __tablename__ = 'ingredients'
    id = Column(Integer, primary_key=True)
    name = Column(Text)

    recipe_ingredient = relationship('RecipeIngredient', back_populates='ingredient')

class RecipeIngredient(Base):
    __tablename__ = 'recipe_ingredients'
    id = Column(Integer, primary_key=True)
    recipe_id = Column(Integer, ForeignKey('recipes.id'))
    ingredient_id = Column(Integer, ForeignKey('ingredients.id'))

    recipe = relationship('Recipe', back_populates='recipe_ingredient')
    ingredient = relationship('Ingredient', back_populates='recipe_ingredient')

ham = Ingredient(name='cereal')
bread = Ingredient(name='milk')
cheese = Ingredient(name='cheese')
sandwich = Recipe(name='ham and cheese')
# Now I'm not sure how to link theses
link1 = RecipeIngredient(recipe_id=sandwich.id, ingredient_id=ham.id)
link2 = RecipeIngredient(recipe_id=sandwich.id, ingredient_id=bread.id)
link3 = RecipeIngredient(recipe_id=sandwich.id, ingredient_id=cheese.id)

session.add_all([ham, bread, cheese, sandwich, link1, link2, link3])
session.commit()

由于RecipeIngredient 对象,这不起作用。我如何能够像这样链接外键来创建这些对象?

【问题讨论】:

  • 由于这被标记为重复,我不能留下答案。我所做的只是在类定义之后添加Base.metadata.create_all(engine)(即在'ham ='行之前),它起作用了。

标签: python sqlalchemy


【解决方案1】:

使用 ForeignKeyConstraint 和 ForeignKey 的组合。

    from sqlalchemy import ForeignKeyConstraint

    class RecipeIngredient(Base):
        ...
        recipe_id = Column(Integer, ForeinKey('recipes.id'))
        ingredient_id = Column(Integer)

        __table_args__ = (
        ForeignKeyConstraint(
            ["ingrediants_id"],
            ["ingredients.id"]
        ),)
        ...

【讨论】:

    猜你喜欢
    • 2021-06-15
    • 2020-03-30
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 2012-12-19
    • 2019-11-24
    • 2012-07-09
    • 1970-01-01
    相关资源
    最近更新 更多