SQLite系统预设管理员重复插入问题技术求助
解决默认管理员重复插入的问题
嘿,我懂你遇到的这个麻烦——每次重启系统,默认管理员就被重复插进数据库,这确实挺烦人的。核心问题就是你的代码没做「存在性检查」,直接就执行插入操作,导致每次启动都跑一遍插入逻辑。下面给你具体的解决方案:
第一步:完善查询与插入逻辑
你需要先检查数据库里是否已经存在预设的默认管理员账号,只有当它不存在的时候,再执行插入操作。修改后的代码如下:
import sqlite3 with sqlite3.connect('esr.db') as db: c = db.cursor() # 先确保admin表已经创建 c.execute('CREATE TABLE IF NOT EXISTS admin (adminuser TEXT NOT NULL, password TEXT NOT NULL);') # 定义你的默认管理员信息 default_admin_username = "admin" # 换成你实际用的默认账号 default_admin_password = "your_default_pwd" # 换成你实际的默认密码 # 检查这个管理员是否已经存在 c.execute('SELECT 1 FROM admin WHERE adminuser = ?', (default_admin_username,)) admin_exists = c.fetchone() # 如果不存在,才插入这条默认数据 if not admin_exists: c.execute('INSERT INTO admin (adminuser, password) VALUES (?, ?)', (default_admin_username, default_admin_password)) db.commit()
关键细节说明
- 存在性检查:用
SELECT 1 FROM admin WHERE adminuser = ?这个查询,只要fetchone()返回结果不为空,就说明管理员已经在数据库里了,直接跳过插入步骤就行。 - 参数化查询:别直接把变量拼进SQL语句里,用
?当占位符传参数,既能避免SQL注入风险,也能防止因为特殊字符导致的语法错误。 - 事务提交:虽然
with块会自动处理事务,但显式调用db.commit()会更稳妥,尤其是在一些旧版本的sqlite3里,写操作可能需要手动提交才能生效。
额外的优化建议
- 别存明文密码:直接存明文密码太不安全了,建议用
passlib或者bcrypt库对密码进行哈希后再存储,举个例子:from passlib.context import CryptContext # 初始化密码哈希上下文 pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") # 生成哈希后的密码 hashed_pwd = pwd_context.hash(default_admin_password) # 插入的时候存这个哈希值就行 - 给账号加唯一约束:在创建表的时候,给
adminuser字段加上UNIQUE约束,从数据库层面直接防止重复插入同一个账号的管理员:CREATE TABLE IF NOT EXISTS admin ( adminuser TEXT NOT NULL UNIQUE, password TEXT NOT NULL );
内容的提问来源于stack exchange,提问作者anoo Ar
相关产品推荐
相关产品推荐

