fix: 修复SQLite UPDATE/DELETE别名语法导致的near 'r'错误

This commit is contained in:
root
2026-04-30 08:41:26 +08:00
parent f585164cc1
commit 8802604568

View File

@ -464,7 +464,6 @@ class EmbeddedGraphDB:
# 构建查询条件 # 构建查询条件
conditions = [] conditions = []
params = [] params = []
joins = []
relation_type = criteria.get('relation') or criteria.get('relation_type', '') relation_type = criteria.get('relation') or criteria.get('relation_type', '')
@ -472,18 +471,18 @@ class EmbeddedGraphDB:
cursor.execute("SELECT id FROM entities WHERE name = ?", (criteria['source'],)) cursor.execute("SELECT id FROM entities WHERE name = ?", (criteria['source'],))
row = cursor.fetchone() row = cursor.fetchone()
if row: if row:
conditions.append("r.source_id = ?") conditions.append("source_id = ?")
params.append(row['id']) params.append(row['id'])
if criteria.get('target'): if criteria.get('target'):
cursor.execute("SELECT id FROM entities WHERE name = ?", (criteria['target'],)) cursor.execute("SELECT id FROM entities WHERE name = ?", (criteria['target'],))
row = cursor.fetchone() row = cursor.fetchone()
if row: if row:
conditions.append("r.target_id = ?") conditions.append("target_id = ?")
params.append(row['id']) params.append(row['id'])
if relation_type: if relation_type:
conditions.append("r.relation_type = ?") conditions.append("relation_type = ?")
params.append(relation_type) params.append(relation_type)
# 通过子查询支持实体属性过滤 # 通过子查询支持实体属性过滤
@ -493,7 +492,7 @@ class EmbeddedGraphDB:
ids = [row['id'] for row in cursor.fetchall()] ids = [row['id'] for row in cursor.fetchall()]
if ids: if ids:
placeholders = ','.join(['?'] * len(ids)) placeholders = ','.join(['?'] * len(ids))
conditions.append(f"r.source_id IN ({placeholders})") conditions.append(f"source_id IN ({placeholders})")
params.extend(ids) params.extend(ids)
if criteria.get('target_contains'): if criteria.get('target_contains'):
@ -502,7 +501,7 @@ class EmbeddedGraphDB:
ids = [row['id'] for row in cursor.fetchall()] ids = [row['id'] for row in cursor.fetchall()]
if ids: if ids:
placeholders = ','.join(['?'] * len(ids)) placeholders = ','.join(['?'] * len(ids))
conditions.append(f"r.target_id IN ({placeholders})") conditions.append(f"target_id IN ({placeholders})")
params.extend(ids) params.extend(ids)
# 源实体类型过滤 # 源实体类型过滤
@ -512,7 +511,7 @@ class EmbeddedGraphDB:
ids = [row['id'] for row in cursor.fetchall()] ids = [row['id'] for row in cursor.fetchall()]
if ids: if ids:
placeholders = ','.join(['?'] * len(ids)) placeholders = ','.join(['?'] * len(ids))
conditions.append(f"r.source_id IN ({placeholders})") conditions.append(f"source_id IN ({placeholders})")
params.extend(ids) params.extend(ids)
# 目标实体类型过滤 # 目标实体类型过滤
@ -522,36 +521,35 @@ class EmbeddedGraphDB:
ids = [row['id'] for row in cursor.fetchall()] ids = [row['id'] for row in cursor.fetchall()]
if ids: if ids:
placeholders = ','.join(['?'] * len(ids)) placeholders = ','.join(['?'] * len(ids))
conditions.append(f"r.target_id IN ({placeholders})") conditions.append(f"target_id IN ({placeholders})")
params.extend(ids) params.extend(ids)
# 源实体状态过滤(检查 entity name 是否以特定后缀结尾等) # 源实体状态过滤
if criteria.get('source_has_status'): if criteria.get('source_has_status'):
status = criteria['source_has_status'] status = criteria['source_has_status']
# 匹配 entities 表中 type 字段包含状态信息的节点
cursor.execute("SELECT id FROM entities WHERE type LIKE ?", cursor.execute("SELECT id FROM entities WHERE type LIKE ?",
(f'%{status}%',)) (f'%{status}%',))
ids = [row['id'] for row in cursor.fetchall()] ids = [row['id'] for row in cursor.fetchall()]
if ids: if ids:
placeholders = ','.join(['?'] * len(ids)) placeholders = ','.join(['?'] * len(ids))
conditions.append(f"r.source_id IN ({placeholders})") conditions.append(f"source_id IN ({placeholders})")
params.extend(ids) params.extend(ids)
if not conditions: if not conditions:
return {"deleted": 0, "message": "无删除条件"} return {"deleted": 0, "message": "无删除条件"}
conditions.append("r.status = 'active'") conditions.append("status = 'active'")
where_clause = " AND ".join(conditions) where_clause = " AND ".join(conditions)
if mode == "soft": if mode == "soft":
cursor.execute(f""" cursor.execute(f"""
UPDATE relations r UPDATE relations
SET status = 'deleted', updated_at = CURRENT_TIMESTAMP SET status = 'deleted', updated_at = CURRENT_TIMESTAMP
WHERE {where_clause} WHERE {where_clause}
""", params) """, params)
else: else:
cursor.execute(f""" cursor.execute(f"""
DELETE FROM relations r DELETE FROM relations
WHERE {where_clause} WHERE {where_clause}
""", params) """, params)