相关疑难解决方法(0)

设置约束所有DEFERRED在PostgreSQL 9.3中没有按预期工作

如果我定义表ab如下:

CREATE TABLE a(i integer);
ALTER TABLE a ADD CONSTRAINT pkey_a PRIMARY KEY (i);
CREATE TABLE b(j integer);
ALTER TABLE b add CONSTRAINT fkey_ij FOREIGN KEY (j)
      REFERENCES a (i) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE;
INSERT INTO a(i) VALUES(1);
Run Code Online (Sandbox Code Playgroud)

然后执行以下操作:

START TRANSACTION;
SET CONSTRAINTS ALL DEFERRED;
INSERT INTO b(j) VALUES(2);
INSERT INTO a(i) VALUES(2);
COMMIT;
Run Code Online (Sandbox Code Playgroud)

它产生以下错误.为什么SET CONSTRAINTS没有达到预期的效果?

错误:表"b"上的插入或更新违反外键约束"fkey_ij"
SQL状态:23503详细信息:表"a"中不存在键(j)=(2).

sql postgresql database-design referential-integrity foreign-keys

12
推荐指数
2
解决办法
9999
查看次数

SQLAlchemy ORM - 推迟约束检查

我对我想要推迟的一个表有一个独特的约束,据我所知,这是 Postgresql 支持的,但在使用 ORM 时,我似乎找不到在 SQLAlchemy 中告诉我的操作这样做的地方(一般而言,不仅仅是这种情况)。我正在使用该bulk_update_mappings()函数,约束是 下的第二个__table_args__。这是我需要使用 SQLAlchemy Core 或创建自己的 SQL 语句来实现的吗?

class Question(Base):
    QuestionType = enum.Enum('QuestionType', 'mcq')
    __tablename__ = 'questions'
    id = Column(Integer, primary_key=True)
    type = Column(Enum(_QuestionType), nullable=False)
    description = Column(String, nullable=False)
    question_order = Column(Integer, nullable=False)
    question_set_id = Column(Integer, ForeignKey('question_sets.id', ondelete='cascade'), nullable=False)

    question_set = relationship('QuestionSet', back_populates='questions')

    __table_args__ = (
        UniqueConstraint('question_set_id', 'description'),
        UniqueConstraint('question_set_id', 'question_order', deferrable=True)
    )
    __mapper_args__ = {
        'polymorphic_identity': 'question',
        'polymorphic_on': type,
    }

#from another class
def reorder(self, new_order, db):
    order = [{'id':i, 'question_order': …
Run Code Online (Sandbox Code Playgroud)

python postgresql sqlalchemy python-3.x

5
推荐指数
1
解决办法
3000
查看次数