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

如何使用Peewee连接现有SQLite数据库并以只读模式读取?

使用Peewee连接现有SQLite数据库并只读操作的正确姿势

我来帮你梳理下用Peewee连接现有SQLite数据库并做只读操作的正确方式,先看看你代码里的几个小问题,再一步步优化:

1. 补全依赖导入与修正基础错误

你的代码里少了几个必要的模块导入,还有__main()__的定义格式有误(应该是main(),不需要括号),另外建议给--db-dir参数加上required=True,避免用户忘记传参:

import argparse
import os
import sys
from peewee import *

db = SqliteDatabase(None)

class Base(Model):
    class Meta:
        database = db

class Table(Base):
    a_date = DateField()
    url = CharField()

    class Meta:
        # 重要:如果你的现有表名不是默认的"table",这里必须指定实际表名
        table_name = "your_actual_table_name"

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--db-dir', action='store', required=True)
    args = parser.parse_args()
    db_path = os.path.join(args.db_dir, 'data.db')

2. 配置只读连接与安全查询逻辑

要实现只读操作,核心是在初始化SQLite数据库时指定mode=ro的连接参数,同时优化异常捕获逻辑,避免笼统捕获所有异常,还要确保连接最终关闭:

try:
        # 初始化数据库并开启只读模式
        db.init(
            db_path,
            pragmas={
                'mode': 'ro',  # 强制只读,任何写操作都会报错
                'foreign_keys': 1  # 可选,保持外键约束检查,提升数据完整性校验
            }
        )
        db.connect()
        
        # 执行只读查询(这里用get()会在无数据时抛出DoesNotExist,注意处理)
        query = Table.select().order_by(Table.a_date.desc()).get()
        print(f"Latest record: date={query.a_date}, url={query.url}")
    except DoesNotExist:
        print("Error: No records found in the target table.")
        sys.exit(1)
    except OperationalError as e:
        print(f"Error connecting to database: {e} (可能是数据库不存在、路径错误或权限不足)")
        sys.exit(1)
    except Exception as e:
        print(f"Unexpected error occurred: {e}")
        sys.exit(1)
    finally:
        # 确保无论成功失败都关闭连接,避免资源泄漏
        if not db.is_closed():
            db.close()

if __name__ == "__main__":
    main()

几个关键注意事项

  • 模型与表结构严格匹配:你的Table模型必须和现有SQLite表的字段名、字段类型完全一致,否则会出现查询错误。如果表名不是类名的小写形式,一定要在Meta中用table_name指定实际表名。
  • 只读模式的作用:设置mode=ro后,Peewee尝试执行任何写操作(插入、更新、删除)都会直接抛出异常,完美满足你仅读取的需求。
  • 精准异常处理:针对不同场景捕获特定异常,比如DoesNotExist处理无数据的情况,OperationalError处理连接失败的情况,比捕获所有Exception更容易定位问题。

内容的提问来源于stack exchange,提问作者Flx Files

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:49:44