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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:57:43