Fix PostgreSQL init_db: rollback after benign schema migration errors.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+23
-2
@@ -92,6 +92,13 @@ def adapt_sql(sql: str) -> str:
|
||||
|
||||
def is_benign_migration_error(exc: BaseException) -> bool:
|
||||
"""ALTER TABLE 重复列等初始化迁移可忽略的错误。"""
|
||||
if is_schema_migration_error(exc):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def is_schema_migration_error(exc: BaseException) -> bool:
|
||||
"""init_db 增量迁移:缺表/缺列/重复列均可忽略。"""
|
||||
msg = str(exc).lower()
|
||||
if any(
|
||||
x in msg
|
||||
@@ -99,18 +106,32 @@ def is_benign_migration_error(exc: BaseException) -> bool:
|
||||
"duplicate column",
|
||||
"already exists",
|
||||
"duplicate key",
|
||||
"no such table",
|
||||
"does not exist",
|
||||
"undefined table",
|
||||
"undefined column",
|
||||
)
|
||||
):
|
||||
return True
|
||||
if isinstance(exc, sqlite3.OperationalError) and "duplicate column" in msg:
|
||||
if isinstance(exc, sqlite3.OperationalError) and (
|
||||
"duplicate column" in msg or "no such table" in msg
|
||||
):
|
||||
return True
|
||||
if _PSYCOPG_OK and isinstance(exc, PgOperationalError):
|
||||
code = getattr(exc, "sqlstate", "") or ""
|
||||
if code in ("42701", "42P07"): # duplicate_column, duplicate_table
|
||||
if code in ("42701", "42P07", "42P01", "42703"):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def rollback_if_postgres(conn: "DbConnection") -> None:
|
||||
if is_postgres():
|
||||
try:
|
||||
conn.rollback()
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
class DbCursor:
|
||||
"""统一 cursor:兼容 sqlite3 的 execute / fetchone / lastrowid。"""
|
||||
|
||||
|
||||
Reference in New Issue
Block a user