You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask API开发中SQLite无法保存数据,查询返回空列表求助

Flask API SQLite数据保存及查询问题解决

问题根源及修复方案

  • 查询逻辑缺失:get_links函数直接调用c.fetchall(),但未先执行查询数据的SQL语句,导致返回空列表。必须先执行SELECT语句再获取结果。
  • SQL注入风险:数据插入使用字符串拼接构造SQL语句,存在安全漏洞,应改用参数化查询。
  • 异常处理语法错误:except sqlite3.DatabaseError or sqlite3.DataError as e写法无效,需用元组包含多个异常类型。

修正后的代码

数据操作代码

import sqlite3
# 初始化数据库连接与游标(需确保在模块加载时执行)
conn = sqlite3.connect('your_db.db', check_same_thread=False)  # Flask多线程环境需添加check_same_thread=False
c = conn.cursor()
# 确保表结构存在
c.execute('''CREATE TABLE IF NOT EXISTS ping (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    links TEXT NOT NULL
)''')
conn.commit()

def data_insert(link):
    try:
        # 参数化查询避免SQL注入
        c.execute("INSERT INTO ping(links) VALUES (?);", (link,))
        conn.commit()
        return "success"
    except sqlite3.DatabaseError as e:
        print("AN ERROR HAS OCCURED")
        print(chalk.red(e))
        conn.rollback()  # 出错时回滚事务
        return "an internal error has occured."

def get_links():
    try:
        # 先执行查询语句
        c.execute("SELECT * FROM ping;")
        links = c.fetchall()
        print(f"links:{links}")
        return links
    except (sqlite3.DatabaseError, sqlite3.DataError) as e:
        print(chalk.red(e))
        return "an internal error has occured."

Flask路由代码(可保留原逻辑)

@app.route("/submit-url")
def main():
    url = request.args.get("url")
    if url is None:
        return "please enter url",404
    else:
        output = db.data_insert(url)
        links = db.get_links()
        print(links)
        return output

内容的提问来源于stack exchange,提问作者buufv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:22:41