用自然语言查询数据库——不用写 SQL,只说你要什么数据
用自然语言查询数据库——不用写 SQL只说你要什么数据“帮我查一下上个月销售额最高的 5 个产品”——只需要说这句话AI 自动生成 SQL 并执行查询返回结果。核心代码#!/usr/bin/env python3# askdb.pyimportsqlite3,os,refromopenaiimportOpenAIfromdotenvimportload_dotenv load_dotenv()clientOpenAI(api_keyos.getenv(DEEPSEEK_API_KEY),base_urlhttps://api.deepseek.com/v1)defget_schema(db_path):获取数据库表结构。connsqlite3.connect(db_path)tablesconn.execute(SELECT name FROM sqlite_master WHERE typetable).fetchall()schema{}fortintables:colsconn.execute(fPRAGMA table_info({t[0]})).fetchall()schema[t[0]][f{c[1]}{c[2]}forcincols]conn.close()returnschemadefgenerate_sql(question,schema):AI 根据自然语言生成 SQL。schema_text\n.join(f{t}:{, .join(c)}fort,cinschema.items())respclient.chat.completions.create(modeldeepseek-chat,messages[{role:system,content:f你是一个 SQL 专家。根据表结构生成 SQL 查询。 表结构{schema_text}规则 1. 只生成 SELECT 查询不执行 INSERT/UPDATE/DELETE 2. 只返回 SQL不要解释 3. 用 LIMIT 限制结果数量默认 20},{role:user,content:question}],temperature0.1,max_tokens500,)returnresp.choices[0].message.content.strip()defexecute_query(db_path,sql):安全执行 SQL 查询。# 安全检查只允许 SELECTifnotre.match(r^\s*SELECT,sql,re.IGNORECASE):returnNone,只允许 SELECT 查询# 限制返回行数ifLIMITnotinsql.upper():sql LIMIT 20connsqlite3.connect(db_path)conn.row_factorysqlite3.Rowtry:rowsconn.execute(sql).fetchall()return[dict(r)forrinrows],len(rows)exceptExceptionase:returnNone,str(e)finally:conn.close()defask(db_path,question):自然语言查询数据库。schemaget_schema(db_path)print(f 数据库{db_path}{len(schema)}个表\n)sqlgenerate_sql(question,schema)print(f SQL{sql}\n)result,infoexecute_query(db_path,sql)ifresultisNone:print(f❌ 查询失败{info})returnprint(f✅ 返回{info}条记录)ifresult:colsresult[0].keys()print( | .join(cols))print(-*50)forrowinresult[:10]:print( | .join(str(v)[:50]forvinrow.values()))if__name____main__:ask(data.db,上个月哪些用户发帖最多显示前 5 名)使用方式python askdb.py今年哪些分类的文章阅读量最高# 数据库zyentor.db15 个表# SQLSELECT category, SUM(view_count) FROM news WHERE is_published1 GROUP BY category ORDER BY SUM(view_count) DESC LIMIT 5# ✅ 返回 5 条记录# category | SUM(view_count)# ai_dev | 15420# news | 8234安全机制只允许 SELECT 查询拒绝 INSERT/UPDATE/DELETE自动加 LIMIT 限制返回行数用异常处理防止 SQL 错误总结一个简单实用的自然语言数据库查询工具让不懂 SQL 的人也能查数据。如果觉得有用欢迎点赞 收藏 关注。