import asyncpg # 删除数据 async def delete_question(db: asyncpg.Connection, question_id: str): delete_sql = """ DELETE FROM t_bi_question WHERE id = $1 """ await db.execute(delete_sql, question_id) # 插入数据 async def insert_question(db: asyncpg.Connection, question_id: str, question: str): insert_sql = """ INSERT INTO t_bi_question (id, question, state_id, is_system, is_collect) VALUES ($1, $2, $3, $4, $5) """ await db.execute(insert_sql, question_id, question, 0, 0, 0) # 修改数据 async def update_question_by_id(db: asyncpg.Connection, question_id: str, **kwargs): update_fields = {k: v for k, v in kwargs.items() if v is not None} if not update_fields: return False set_clause = ", ".join([f"{field} = ${i + 1}" for i, field in enumerate(update_fields.keys())]) sql = f""" UPDATE t_bi_question SET {set_clause} WHERE id = ${len(update_fields) + 1} """ params = list(update_fields.values()) + [question_id] try: await db.execute(sql, *params) return True except Exception as e: print(f"更新失败: {e}") return False # 根据问题 ID 查询 SQL async def get_question_by_id(db: asyncpg.Connection, question_id: str): select_sql = """ SELECT * FROM t_bi_question WHERE id = $1 """ _data = await db.fetch(select_sql, question_id) return _data # 根据 SQL 查询数据 async def get_data_by_sql(db: asyncpg.Connection, sql: str): _data = await db.fetch(sql) return _data # 保存系统推荐 async def set_system_recommend_questions(db: asyncpg.Connection, question_id: str, flag: str): sql = """ UPDATE t_bi_question SET is_system = $1 WHERE id = $2 """ try: await db.execute(sql, int(flag), question_id) return True except Exception as e: print(f"更新失败: {e}") return False # 设置用户收藏 async def set_user_collect_questions(db: asyncpg.Connection, question_id: str, flag: str): sql = """ UPDATE t_bi_question SET is_collect = $1 WHERE id = $2 """ try: await db.execute(sql, int(flag), question_id) return True except Exception as e: print(f"更新失败: {e}") return False # 查询系统推荐问题 async def get_system_recommend_questions(db: asyncpg.Connection, offset: int, limit: int): query = """ SELECT * FROM t_bi_question where is_system=1 ORDER BY id DESC LIMIT $1 OFFSET $2; """ return await db.fetch(query, limit, offset) async def get_system_recommend_questions_count(db: asyncpg.Connection): query = """ SELECT COUNT(*) FROM t_bi_question where is_system=1; """ return await db.fetchval(query) async def get_user_publish_questions(db: asyncpg.Connection, type_id: int, offset: int, limit: int): # 基础查询 query = """ SELECT * FROM t_bi_question """ # 根据 type_id 动态添加 WHERE 条件 if type_id == 1: query += " WHERE is_collect = 1" # 添加排序和分页 query += " ORDER BY id DESC LIMIT $1 OFFSET $2;" # 执行查询 return await db.fetch(query, limit, offset) async def get_user_publish_questions_count(db: asyncpg.Connection): query = """ SELECT COUNT(*) FROM t_bi_question; """ return await db.fetchval(query) # 获取数据集的字段名称 async def get_column_names(db: asyncpg.Connection, sql: str): # 执行查询(添加 LIMIT 1) sql = sql.replace(";", "") sql = sql + ' limit 1' result = await db.fetchrow(sql) # 获取列名 # 获取列名 if result: column_names = list(result.keys()) return column_names else: return [] from openai import OpenAI from Config import MODEL_NAME, MODEL_API_KEY # 初始化 OpenAI 客户端 client = OpenAI( api_key=MODEL_API_KEY, base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", ) # 利用AI获取数据集的X轴和Y轴的列名 def generate_columns_with_ai(data): """ 利用大模型解析数据,生成 category_columns_str 和 value_column_str :param data: 数据集(列表字典格式,例如:[{"行政区划名": "二道区", "学校名称": "清华附中", "课程数量": 100}, ...]) :param api_key: OpenAI API 密钥 :return: (category_columns_str, value_column_str) """ # 获取所有字段名 columns = list(data[0].keys()) if data else [] # 构造提示词 prompt = f""" 给定以下字段名列表:{columns},请分析并回答以下问题: 1. 哪些字段适合作为分类字段(category_columns_str)?请用逗号分隔。 2. 哪个字段适合作为数值字段(value_column_str)? 3. 以JSON格式返回结果,但不要输出 json``` ,``` 返回格式: category_columns_str: <字段1,字段2,...> value_column_str: <字段> """ # 调用大模型 response = client.chat.completions.create( model=MODEL_NAME, messages=[ {"role": "system", "content": "你是一个专业的语义分类助手。"}, {"role": "user", "content": prompt} ], max_tokens=500 ) # 解析模型返回的结果 result = response.choices[0].message.content category_columns_str = result.split("category_columns_str: ")[1].split("\n")[0].strip() value_column_str = result.split("value_column_str: ")[1].strip() return category_columns_str, value_column_str