参考:https://stackoverflow.com/questions/50456547/how-to-set-on-conflict sqlalchemy 官方文档:https://docs.sqlalchemy.org/en/20/dialects/sqlite.html sqlite 官网文档
冲突类型
-
sqlite_on_conflict_not_null
-
sqlite_on_conflict_primary_key
-
sqlite_on_conflict_unique
可选操作
-
ROLLBACK
-
ABORT
-
FAIL
-
IGNORE
-
REPLACE
语法
-
联合约束
UniqueConstraint("id", "data", sqlite_on_conflict="IGNORE")
-
独立约束
Column(
"data", Integer, unique=True, sqlite_on_conflict_unique="IGNORE"
)
- 主键约束
Column(
"id",
Integer,
primary_key=True,
sqlite_on_conflict_primary_key="FAIL",
)
方法一
tbl1 = sa.Table(
't1',
metadata,
sa.Column('id', sa.Integer, primary_key=True),
sa.Column(
'name', sa.String, unique=True, sqlite_on_conflict_unique='REPLACE'
),
sa.Column('colour', sa.String),
)
生成的 SQL 语句
CREATE TABLE t1 (
id INTEGER NOT NULL,
name VARCHAR,
colour VARCHAR,
PRIMARY KEY (id),
UNIQUE (name) ON CONFLICT REPLACE
)
方法二
tbl2 = sa.Table(
't2',
metadata,
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('name', sa.String),
sa.Column('colour', sa.String),
sa.Column('size', sa.Integer),
sa.UniqueConstraint('name', 'colour', sqlite_on_conflict='IGNORE')
)
生成的 SQL 语句
CREATE TABLE t2 (
id INTEGER NOT NULL,
name VARCHAR,
colour VARCHAR,
size INTEGER,
PRIMARY KEY (id),
UNIQUE (name, colour) ON CONFLICT IGNORE
)