fix: SQLAlchemy 2.0 text() wrapper for raw SQL in knowledge_admin.py

This commit is contained in:
qyyfw committed 2026-07-02 22:56:48 +08:00
1 parent 4adc3fc054
commit 855e1cb9c6
1 file changed
+20 -20
+20 -20
View File
@@ -3,8 +3,8 @@
Phase 2.4: AI PaaS Knowledge Base Management + External KB Integration Phase 2.4: AI PaaS Knowledge Base Management + External KB Integration
""" """
from fastapi import APIRouter, Depends, HTTPException, Query, Body from fastapi import APIRouter, Depends, HTTPException, Query, Body
from sqlalchemy import or_, func, desc, asc, text
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from sqlalchemy import or_, func, desc, asc
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from typing import Optional, List, Dict, Any from typing import Optional, List, Dict, Any
from datetime import datetime from datetime import datetime
@@ -715,7 +715,7 @@ def _get_external_services_table(db: Session):
# ORM 模型不存在,用原生 SQL # ORM 模型不存在,用原生 SQL
try: try:
result = db.execute( result = db.execute(
"SELECT id, name, service_type, api_url, api_key, config, is_enabled, status, created_at, updated_at FROM external_kb_services ORDER BY created_at DESC" text("SELECT id, name, service_type, api_url, api_key, config, is_enabled, status, created_at, updated_at FROM external_kb_services ORDER BY created_at DESC")
) )
rows = result.fetchall() rows = result.fetchall()
return [ return [
@@ -831,8 +831,8 @@ async def create_external_service(
# 使用原生 SQL 插入(兼容 ORM 模型可能未注册) # 使用原生 SQL 插入(兼容 ORM 模型可能未注册)
try: try:
db.execute( db.execute(
f"INSERT INTO external_kb_services (id, name, service_type, api_url, api_key, config, is_enabled, status, created_at, updated_at) " text(f"INSERT INTO external_kb_services (id, name, service_type, api_url, api_key, config, is_enabled, status, created_at, updated_at) "
f"VALUES (:id, :name, :stype, :url, :key, :cfg, 1, :status, NOW(), NOW())", f"VALUES (:id, :name, :stype, :url, :key, :cfg, 1, :status, NOW(), NOW())"),
{ {
"id": service_id, "id": service_id,
"name": req.name, "name": req.name,
@@ -847,7 +847,7 @@ async def create_external_service(
except Exception as e: except Exception as e:
# 表可能不存在,尝试创建 # 表可能不存在,尝试创建
logger.warning(f"插入外部服务失败: {e}, 尝试创建表") logger.warning(f"插入外部服务失败: {e}, 尝试创建表")
db.execute(""" db.execute(text("""
CREATE TABLE IF NOT EXISTS external_kb_services ( CREATE TABLE IF NOT EXISTS external_kb_services (
id VARCHAR(36) PRIMARY KEY, id VARCHAR(36) PRIMARY KEY,
name VARCHAR(200) NOT NULL, name VARCHAR(200) NOT NULL,
@@ -860,12 +860,12 @@ async def create_external_service(
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
""") """))
db.commit() db.commit()
# 再次尝试插入 # 再次尝试插入
db.execute( db.execute(
f"INSERT INTO external_kb_services (id, name, service_type, api_url, api_key, config, is_enabled, status, created_at, updated_at) " text(f"INSERT INTO external_kb_services (id, name, service_type, api_url, api_key, config, is_enabled, status, created_at, updated_at) "
f"VALUES (:id, :name, :stype, :url, :key, :cfg, 1, :status, NOW(), NOW())", f"VALUES (:id, :name, :stype, :url, :key, :cfg, 1, :status, NOW(), NOW())"),
{ {
"id": service_id, "id": service_id,
"name": req.name, "name": req.name,
@@ -911,7 +911,7 @@ async def update_external_service(
# 查找现有服务 # 查找现有服务
try: try:
result = db.execute( result = db.execute(
"SELECT id, name, service_type, api_url, api_key FROM external_kb_services WHERE id = :sid", text("SELECT id, name, service_type, api_url, api_key FROM external_kb_services WHERE id = :sid"),
{"sid": service_id} {"sid": service_id}
) )
row = result.fetchone() row = result.fetchone()
@@ -951,7 +951,7 @@ async def update_external_service(
params["sid"] = service_id params["sid"] = service_id
db.execute( db.execute(
f"UPDATE external_kb_services SET {set_clause} WHERE id = :sid", text(f"UPDATE external_kb_services SET {set_clause} WHERE id = :sid"),
params params
) )
db.commit() db.commit()
@@ -977,7 +977,7 @@ async def delete_external_service(
"""删除外部知识库服务配置""" """删除外部知识库服务配置"""
try: try:
result = db.execute( result = db.execute(
"SELECT name FROM external_kb_services WHERE id = :sid", text("SELECT name FROM external_kb_services WHERE id = :sid"),
{"sid": service_id} {"sid": service_id}
) )
row = result.fetchone() row = result.fetchone()
@@ -988,7 +988,7 @@ async def delete_external_service(
raise HTTPException(status_code=404, detail="外部知识库服务不存在") raise HTTPException(status_code=404, detail="外部知识库服务不存在")
name = row[0] name = row[0]
db.execute("DELETE FROM external_kb_services WHERE id = :sid", {"sid": service_id}) db.execute(text("DELETE FROM external_kb_services WHERE id = :sid"), {"sid": service_id})
db.commit() db.commit()
LogService.log_audit( LogService.log_audit(
@@ -1012,7 +1012,7 @@ async def check_external_service_status(
"""实时检查外部知识库服务的连接状态""" """实时检查外部知识库服务的连接状态"""
try: try:
result = db.execute( result = db.execute(
"SELECT service_type, api_url, api_key FROM external_kb_services WHERE id = :sid", text("SELECT service_type, api_url, api_key FROM external_kb_services WHERE id = :sid"),
{"sid": service_id} {"sid": service_id}
) )
row = result.fetchone() row = result.fetchone()
@@ -1027,7 +1027,7 @@ async def check_external_service_status(
# 更新状态 # 更新状态
try: try:
db.execute( db.execute(
"UPDATE external_kb_services SET status = :status, updated_at = NOW() WHERE id = :sid", text("UPDATE external_kb_services SET status = :status, updated_at = NOW() WHERE id = :sid"),
{"status": conn_result.get("status", "disconnected"), "sid": service_id} {"status": conn_result.get("status", "disconnected"), "sid": service_id}
) )
db.commit() db.commit()
@@ -1061,7 +1061,7 @@ async def sync_knowledge_base(
# 查询外部服务配置 # 查询外部服务配置
try: try:
result = db.execute( result = db.execute(
"SELECT name, service_type, api_url, api_key, config FROM external_kb_services WHERE id = :sid", text("SELECT name, service_type, api_url, api_key, config FROM external_kb_services WHERE id = :sid"),
{"sid": ext_service_id} {"sid": ext_service_id}
) )
row = result.fetchone() row = result.fetchone()
@@ -1103,7 +1103,7 @@ async def sync_knowledge_base(
setattr(kb, "external_id", ext_kb_id) setattr(kb, "external_id", ext_kb_id)
except Exception: except Exception:
db.execute( db.execute(
"UPDATE knowledge_bases SET external_id = :eid WHERE id = :kid", text("UPDATE knowledge_bases SET external_id = :eid WHERE id = :kid"),
{"eid": ext_kb_id, "kid": kb_id} {"eid": ext_kb_id, "kid": kb_id}
) )
else: else:
@@ -1158,7 +1158,7 @@ async def sync_knowledge_base(
setattr(kb, "external_id", ext_kb_id) setattr(kb, "external_id", ext_kb_id)
except Exception: except Exception:
db.execute( db.execute(
"UPDATE knowledge_bases SET external_id = :eid WHERE id = :kid", text("UPDATE knowledge_bases SET external_id = :eid WHERE id = :kid"),
{"eid": ext_kb_id, "kid": kb_id} {"eid": ext_kb_id, "kid": kb_id}
) )
@@ -1210,7 +1210,7 @@ async def sync_knowledge_base(
setattr(kb, "external_id", ext_kb_id) setattr(kb, "external_id", ext_kb_id)
except Exception: except Exception:
db.execute( db.execute(
"UPDATE knowledge_bases SET external_id = :eid WHERE id = :kid", text("UPDATE knowledge_bases SET external_id = :eid WHERE id = :kid"),
{"eid": ext_kb_id, "kid": kb_id} {"eid": ext_kb_id, "kid": kb_id}
) )
@@ -1255,7 +1255,7 @@ async def sync_knowledge_base(
setattr(kb, "external_sync_status", "synced" if sync_result["synced"] else "error") setattr(kb, "external_sync_status", "synced" if sync_result["synced"] else "error")
except Exception: except Exception:
db.execute( db.execute(
"UPDATE knowledge_bases SET external_sync_status = :es WHERE id = :kid", text("UPDATE knowledge_bases SET external_sync_status = :es WHERE id = :kid"),
{"es": "synced" if sync_result["synced"] else "error", "kid": kb_id} {"es": "synced" if sync_result["synced"] else "error", "kid": kb_id}
) )
@@ -1271,7 +1271,7 @@ async def sync_knowledge_base(
setattr(kb, "external_sync_status", "error") setattr(kb, "external_sync_status", "error")
except Exception: except Exception:
db.execute( db.execute(
"UPDATE knowledge_bases SET external_sync_status = 'error' WHERE id = :kid", text("UPDATE knowledge_bases SET external_sync_status = 'error' WHERE id = :kid"),
{"kid": kb_id} {"kid": kb_id}
) )
db.commit() db.commit()