我是批量加载数据,并且可以在事后比以逐行为基础更便宜地重新计算所有触发器修改.
如何暂时禁用PostgreSQL中的所有触发器?
关于这个答案,我偶然发现了一个我无法解释的现象.
版本:
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)
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.
我错过了什么,或者这是一个(相当无害)的错误?
因此,修改CTE的数据也可以工作,尽管它有一个NOT DEFERREDpk 失败:
WITH x AS (
UPDATE t SET id = 1 WHERE id = 2 …Run Code Online (Sandbox Code Playgroud) 我正在使用 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) 我对我想要推迟的一个表有一个独特的约束,据我所知,这是 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) postgresql ×4
python ×2
sqlalchemy ×2
bulkinsert ×1
constraints ×1
python-3.x ×1
transactions ×1
triggers ×1