如果你的程序中 需要多次调用数据库操作(比如多个函数都要查用户、插日志、更新状态等),不要复用同一个游标或连接,而是采用 "每次操作都新建连接 + 使用 with" 的模式,并通过封装工具函数来避免重复代码。
python
import sqlite3
CURRENT_DIR = os.path.dirname(os.path.abspath(__file__)) # 获取当前脚本所在目录的绝对路径
DB_DIR = os.path.join(CURRENT_DIR, 'shujulu') # 定义数据库文件夹路径为当前目录下的 'shujulu'
os.makedirs(DB_DIR, exist_ok=True) # 创建数据库目录(如果不存在)
DATABASE = os.path.join(DB_DIR, 'shujulu_02.db') # 定义数据库文件完整路径
def db_execute(query, params=(), fetch=False):
"""
执行 SQL 语句
:param query: SQL 语句(带 ? 占位符)
:param params: 参数元组
:param fetch: 是否返回查询结果(SELECT 用 True,INSERT/UPDATE 用 False)
:return: 如果 fetch=True,返回查询结果;否则返回 None
"""
with sqlite3.connect(DATABASE) as conn:
cursor = conn.cursor()
cursor.execute(query, params)
if fetch:
return cursor.fetchall()
# 否则自动 commit(with 退出时)
调用函数
python
# 新建数据库--表
def init_db():
# 使用 IF NOT EXISTS 避免重复创建报错
db_execute('''
CREATE TABLE IF NOT EXISTS user (
id INTEGER PRIMARY KEY AUTOINCREMENT,
userid TEXT UNIQUE NOT NULL,
password TEXT NOT NULL,
role TEXT,
userid_ TEXT,
password_ TEXT
)
''')
# 可以继续创建其他表
# 插入用户
def insert_user(userid, password, role, userid_, password_):
db_execute(
'INSERT INTO user (userid, password, role, userid_, password_) VALUES (?, ?, ?, ?, ?)',
(userid, password, role, userid_, password_)
)
# 查询用户
def get_user(userid):
rows = db_execute('SELECT * FROM user WHERE userid = ?', (userid,), fetch=True)
return rows[0] if rows else None
# 更新密码
def update_password(userid, new_pass):
db_execute('UPDATE user SET password = ? WHERE userid = ?', (new_pass, userid))
仅供参考和研究。学习交流!!!