Python列表重复元素索引问题及登录管理器优化咨询
解决同域名多账号的TUI选择与数据库匹配问题
一、TUI选择时区分重复域名条目
直接用域名作为选择项会导致重复无法区分,核心解决思路是把数据库的唯一ID和条目详情(域名+账号/备注)组合成选择文本,用户选择后提取ID,直接用ID查询数据库,完全绕开列表index()的限制。
示例代码(基于beaupy):
import beaupy import sqlite3 # 从数据库获取所有登录条目 def get_all_logins(): conn = sqlite3.connect('logins.db') cursor = conn.cursor() cursor.execute('SELECT id, domain, username, note FROM logins') rows = cursor.fetchall() conn.close() return rows logins = get_all_logins() # 构造选择选项:拼接ID、域名、账号、备注为可读文本 options = [f"[{row[0]}] {row[1]} - {row[2]} {'('+row[3]+')' if row[3] else ''}" for row in logins] # 让用户选择条目 selected = beaupy.select(options, prompt="选择要查看的登录条目") if selected: # 从选中文本中提取唯一ID login_id = int(selected.split(']')[0][1:]) # 用ID查询完整记录 conn = sqlite3.connect('logins.db') cursor = conn.cursor() cursor.execute('SELECT * FROM logins WHERE id = ?', (login_id,)) record = cursor.fetchone() conn.close() print(f"选中记录:ID={record[0]}, 域名={record[1]}, 账号={record[2]}, 备注={record[4]}")
二、数据库设计优化
核心表结构设计
必须包含自增主键ID作为唯一标识,同时存储必要字段,建议结构:
CREATE TABLE IF NOT EXISTS logins ( id INTEGER PRIMARY KEY AUTOINCREMENT, -- 唯一ID,解决重复域名匹配问题 domain TEXT NOT NULL, -- 域名 username TEXT NOT NULL, -- 账号 password TEXT NOT NULL, -- 加密后的密码 note TEXT DEFAULT '', -- 备注,用于区分同域名账号 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 创建时间 updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 更新时间 );
索引优化
为常用查询字段添加索引,提升查询速度:
-- 按域名查询时加速 CREATE INDEX IF NOT EXISTS idx_domain ON logins(domain); -- 可选:限制同一域名下账号唯一(根据需求开启) CREATE UNIQUE INDEX IF NOT EXISTS idx_domain_username ON logins(domain, username);
三、存储方案优化
密码加密存储
绝对禁止明文存储密码,推荐使用cryptography库的Fernet对称加密:
from cryptography.fernet import Fernet import sqlite3 # 首次运行生成密钥,需妥善保管(丢失则无法解密) def generate_key(): key = Fernet.generate_key() with open('secret.key', 'wb') as key_file: key_file.write(key) # 加载本地密钥 def load_key(): return open('secret.key', 'rb').read() # 加密密码 def encrypt_password(password, key): fernet = Fernet(key) return fernet.encrypt(password.encode()).decode() # 解密密码 def decrypt_password(encrypted_password, key): fernet = Fernet(key) return fernet.decrypt(encrypted_password.encode()).decode() # 示例:插入加密后的登录记录 key = load_key() conn = sqlite3.connect('logins.db') cursor = conn.cursor() encrypted_pwd = encrypt_password('my_secure_password', key) cursor.execute('INSERT INTO logins (domain, username, password, note) VALUES (?, ?, ?, ?)', ('hello.com', 'work_user', encrypted_pwd, '工作账号')) conn.commit() conn.close()
数据备份建议
- 定期备份数据库文件(
logins.db)和密钥文件(secret.key) - 备份文件需加密后存储到本地安全位置或加密云盘
内容的提问来源于stack exchange,提问作者Ori
相关产品推荐
相关产品推荐

