【问题标题】:sqlalchemy, violation foreign key constraintsqlalchemy,违反外键约束
【发布时间】:2013-06-22 11:09:33
【问题描述】:

我是 sqlalchemy 的新手。我想为不同的表创建一个有两个外键的类。为什么会出现下一个错误?

sqlalchemy.exc.IntegrityError: (IntegrityError) insert or update on table "event" violates foreign key constraint "event_user_fkey"
DETAIL:  Key (user)=(U) is not present in table "user".
 'INSERT INTO event (id, "user", item) VALUES (%(id)s, %(user)s, %(item)s)' {'item': 'I', 'user': 'U', 'id': 'E'}

接下来是我的代码:

class User(Base):
    __tablename__ = 'user'
    id = Column(String, primary_key=True)

    def __init__(self, id):
        self.id = id

class Item(Base):
    __tablename__ = 'item'
    id = Column(String, primary_key=True)

    def __init__(self, id):
        self.id = id

class Event(Base):
    __tablename__ = 'event'
    id = Column(String, primary_key=True)
    user = Column(String, ForeignKey('user.id'))
    item = Column(String, ForeignKey('item.id'))

    def __init__(self, id, user_id, item_id):
        self.id = id
        self.user = user_id
        self.item = item_id

我使用 postgresql 作为后端。

Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
usr = User('U')
it = Item('I')
event = Event('E', usr.id, it.id)
session.add(usr)
session.add(it)
session.add(event)

【问题讨论】:

  • 如果你想实现一个交易块,每个session.add()之后的session.flush()应该会有所帮助。

标签: postgresql sqlalchemy


【解决方案1】:

错误似乎很明显: Key (user)=(U) is not present in table "user".

所以它试图在用户被提交到数据库之前插入 Event 行,这打破了 ForeignKey 约束,导致了这个错误。在提交事件之前尝试将用户和项目提交到数据库,这取决于它们,问题应该会消失。

【讨论】:

    猜你喜欢
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多