相关疑难解决方法(0)

如何在PostgreSQL中暂时禁用触发器?

我是批量加载数据,并且可以在事后比以逐行为基础更便宜地重新计算所有触发器修改.

如何暂时禁用PostgreSQL中的所有触发器?

postgresql triggers bulkinsert

117
推荐指数
7
解决办法
10万
查看次数

约束定义DEFERRABLE INTITIALLY IMMEDIATE仍然是DEFERRED?

关于这个答案,我偶然发现了一个我无法解释的现象.

版本:
x86_64-unknown-linux-gnu上的PostgreSQL 9.1.2,由gcc-4.4.real编译(Debian 4.4.5-8)4.4.5,64位

请考虑以下演示.测试平台:

CREATE TEMP TABLE t (
  id  integer
 ,txt text
 ,CONSTRAINT t_pkey PRIMARY KEY (id) DEFERRABLE INITIALLY IMMEDIATE
);

INSERT INTO t VALUES
 (1, 'one')
,(2, 'two');
Run Code Online (Sandbox Code Playgroud)

1)修改多行的UPDATE语句:

UPDATE t
SET    id = t_old.id
FROM   t t_old
WHERE (t.id, t_old.id) IN ((1,2), (2,1));
Run Code Online (Sandbox Code Playgroud)

目前的实施似乎有一个错误?上面的UPDATE虽然不应该有效.约束已定义INITIALLY IMMEDIATE,我没有使用SET CONSTRAINTS.

我错过了什么,或者这是一个(相当无害)的错误?


2)数据修改CTE

因此,修改CTE的数据也可以工作,尽管它有一个NOT DEFERREDpk 失败:

WITH x AS (
    UPDATE t SET id = 1 WHERE id = 2 …
Run Code Online (Sandbox Code Playgroud)

postgresql constraints postgresql-9.1

14
推荐指数
2
解决办法
1万
查看次数

如何在 SQLALchemy Core 中`SET CONSTRAINTS ... DEFERRED`

我正在使用 SQLAlchemy 和 PostgreSQL。Postgres 支持执行延迟约束,这允许我们将检查表上的约束推迟到事务结束。

例如,在 SQLAlchemy 中,我可能会定义一个这样的表:

t_group_categories = Table('group_categories', metadata,
    Column('id', Integer, primary_key=True),
    Column('group_id', Integer, ForeignKey('groups.id', deferrable=True))
)
Run Code Online (Sandbox Code Playgroud)

SQLAlchemy 将生成一个CREATE TABLE类似于以下内容的语句:

CREATE TABLE group_categories
(
  id serial NOT NULL,
  group_id integer,
  CONSTRAINT group_categories_pkey PRIMARY KEY (id),
  CONSTRAINT group_categories_group_id_fkey FOREIGN KEY (group_id)
      REFERENCES groups (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE CASCADE DEFERRABLE INITIALLY IMMEDIATE
)
Run Code Online (Sandbox Code Playgroud)

据我了解,这DEFERRABLE INITIALLY IMMEDIATE意味着FOREIGN KEY约束将表现为不可延迟约束,除非另有明确说明,这正是我想要的。

问题是我似乎找不到任何关于如何让 SQLAlchemy 核心SET CONSTRAINTS ... DEFERRED在事务内部实际发出命令的信息。例如,假设我有以下代码:

connection = engine.connect() …
Run Code Online (Sandbox Code Playgroud)

python postgresql transactions sqlalchemy

7
推荐指数
1
解决办法
1758
查看次数

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
查看次数