You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Python中结合SQLite与Pandas实现按Id排序的指定字段查询

解决方法

你的问题核心在于排序操作和实际查询是分开执行的——你先执行了一个带排序的SELECT *但没有使用这个结果,后面实际获取数据的查询语句并没有包含排序逻辑,所以自然得不到按Id排序的结果。另外,直接用字符串拼接SQL语句存在SQL注入风险,也需要修正。

下面是修正后的完整实现方案:

import os
import pandas as pd
import sqlite3

conn = sqlite3.connect('insight.db')
c = conn.cursor()

def search_keyword(term):
    # 1. 修正pandas查询:直接在SQL中完成筛选、字段选择和排序,同时用参数化避免注入
    sql_query = "SELECT date, content FROM GkData WHERE content LIKE ? ORDER BY Id DESC"
    # 用%包裹搜索词,传递给参数化查询
    print(pd.read_sql_query(sql_query, conn, params=(f'%{term}%',)))
    
    # 2. 修正游标查询:同样加入排序和参数化
    c.execute(sql_query, (f'%{term}%',))
    data = c.fetchall()
    for idx, row in enumerate(data):
        # 直接从元组提取content,不用字符串替换
        print(f'[ {idx} ] =====> {row[1]}')

while True:
    search = input("Search term: ")
    if not search:  # 输入空回车即可退出程序
        break
    search_keyword(str(search))

conn.close()

关键改动说明:

  • 合并排序与查询:把ORDER BY Id DESC直接加到需要获取结果的SQL语句中,确保返回的结果已经是按Id排序后的(如果需要升序,把DESC改成ASC即可)。
  • 参数化查询:使用SQLite的?占位符传递搜索参数,代替字符串格式化,彻底避免SQL注入风险,同时让代码更健壮。
  • 简化结果处理:游标返回的row是元组,row[0]对应date字段,row[1]对应content字段,直接提取即可,不需要用字符串替换来清理格式。
  • 新增退出逻辑:加入了空输入退出循环的功能,避免程序一直运行无法终止。

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

火山引擎 最新活动