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

Python SQLite3入门:如何根据输入名称查询数据库特定行?

实现动态按列名查询行数据(SQLite3 + Python)

嘿,作为纯新手能自己动手尝试数据库操作已经超棒啦!我来帮你实现这个“输入列名,显示对应行数据”的需求,还会帮你避开新手最容易踩的SQL注入坑~

第一步:先确保你的表已经创建好

假设你还没创建测试表,我先给你一段能直接用的代码,创建一个叫students的表并插入测试数据:

import sqlite3

# 连接数据库(不存在则自动创建)
conn = sqlite3.connect('tutorial.db')
c = conn.cursor()

# 创建表(如果不存在)
def create_table():
    c.execute('''CREATE TABLE IF NOT EXISTS students
                 (id INTEGER PRIMARY KEY AUTOINCREMENT,
                  name TEXT,
                  age INTEGER,
                  grade TEXT)''')
    # 插入几条测试数据(避免重复插入)
    test_data = [
        ("Alice", 16, "10th"),
        ("Bob", 17, "11th"),
        ("Charlie", 16, "10th")
    ]
    c.executemany("INSERT OR IGNORE INTO students (name, age, grade) VALUES (?, ?, ?)", test_data)
    conn.commit()

create_table()

第二步:实现动态查询功能(安全版)

新手最容易犯的错误是直接把用户输入拼到SQL语句里,这会导致SQL注入风险。所以我们先验证用户输入的列名是否真的存在于表中,再执行查询:

def get_column_data(column_name):
    # 先获取表的所有列名,验证输入的列是否合法
    c.execute("PRAGMA table_info(students)")
    columns = [col[1] for col in c.fetchall()]
    
    if column_name not in columns:
        print(f"错误:表中不存在名为'{column_name}'的列!")
        print(f"可用列名:{', '.join(columns)}")
        return
    
    # 因为已经验证过列名合法,这里拼接SQL是安全的
    query = f"SELECT {column_name} FROM students"
    c.execute(query)
    rows = c.fetchall()
    
    print(f"\n列'{column_name}'的所有行数据:")
    for row in rows:
        print(row[0])  # 只查询了一列,取元组第一个元素即可

# 让用户输入列名
user_input = input("请输入要查询的列名:")
get_column_data(user_input)

# 操作完成后关闭连接
conn.close()

如果你的需求是「输入列的值,显示对应整行数据」

哦,可能你表述有点模糊,如果是想比如输入Alice(name列的值),显示她的整行数据,那可以用这段代码:

def get_row_by_column_value(column_name, value):
    # 先验证列名合法性
    c.execute("PRAGMA table_info(students)")
    columns = [col[1] for col in c.fetchall()]
    
    if column_name not in columns:
        print(f"错误:表中不存在名为'{column_name}'的列!")
        print(f"可用列名:{', '.join(columns)}")
        return
    
    # 这里用?占位符处理值,彻底避免SQL注入
    query = f"SELECT * FROM students WHERE {column_name} = ?"
    c.execute(query, (value,))
    rows = c.fetchall()
    
    if not rows:
        print(f"没有找到{column_name}等于'{value}'的行")
    else:
        print(f"\n找到的行数据:")
        # 先打印列名,让结果更清晰
        print("\t".join(columns))
        for row in rows:
            print("\t".join(str(item) for item in row))

# 用户输入列名和对应值
col_name = input("请输入列名:")
col_value = input(f"请输入{col_name}对应的值:")
get_row_by_column_value(col_name, col_value)

conn.close()

关键知识点小提示

  • PRAGMA table_info(表名):用来获取表的结构,包括列名,这样我们能验证用户输入的列是否合法,杜绝恶意输入。
  • SQL注入防护:对于列名,我们只能先验证再拼接(因为SQLite不支持用占位符替换列名);对于列的值,一定要用?占位符,把值作为参数传给execute(),绝对不能直接拼字符串!
  • fetchall():获取查询结果的所有行,返回的是元组列表,遍历就能拿到每一行的数据。

试试看,有问题随时调整~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:50:28