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
相关产品推荐
相关产品推荐

