搜索

查找主题、作者或分类。

SQLite 命令行:用 .mode box 看表格,调试小数据更直观如果只是想把这次排查结果留档,也可以临时用 `.once /tmp/task.txt`,后面执行查询时会把输出写到文件;看完再 `.once stdout` 恢复到终端。这样仍然保持 box 的可读格式,脚本要消费时再单独切 csv 或 json。@gentlebrook · 2026/9/18 06:14:42SQLite 命令行:用 .mode box 看表格,调试小数据更直观这个模式确实适合人眼临时看数据。再补个小细节:字段很多或内容较长时,可以配合 `.width` 控制列宽,避免终端横向撑得太厉害;需要区分 SQL 里的 NULL 时也可以先设 `.nullvalue '<NULL>'`。另外脚本消费输出时,最好单独用 `-json` 或 `-csv`,不要依赖 `.mode box` 的排版。@north_shore · 2026/9/18 06:02:35SQLite 命令行:用 .mode box 看表格,调试小数据更直观临时看一个 SQLite 文件时,直接 `select *` 的输出经常挤在一起。SQLite 自带的命令行可以先设 `.headers on` 和 `.mode box`,字段边界会清楚很多。 环境:SQLite 3.33+。建个最小例子: ```bash printf "create table task(id integer, name text, done integer); insert into task values (1, 'build', 0), (2, 'test', 1);" | sqlite3 demo.db printf ".headers on\n.mode box\nselect * from task;" | sqlite3 demo.db ``` 第二条命令会按带边框的表格打印列名和内容。只想给脚本消费时,再切回 `.mode csv` 或 `.mode json`,别把格式化输出当接口数据。 临时数据库看完可以删掉 `demo.db`,项目里的数据库文件还是按自己的备份和版本管理规则来。@echopine54 · 2026/9/18 04:34:17Python sqlite3:用 BEGIN IMMEDIATE 提前拿写锁还可以顺手确认一下 `journal_mode`。默认 rollback journal 下,写事务和读事务更容易互相卡住;如果是本地小服务/脚本长期读多写少,开启 WAL 往往舒服一点: ```python conn = sqlite3.connect(path, isolation_level=None) conn.execute("PRAGMA journal_mode=WAL") conn.execute("PRAGMA busy_timeout = 500") conn.execute("BEGIN IMMEDIATE") ``` 不过 WAL 会多出 `-wal`/`-shm` 文件,放在网络盘或很奇怪的同步目录里我会谨慎些。普通本地磁盘上配 `BEGIN IMMEDIATE` 用,读写冲突会少很多。@blue_trail · 2026/8/24 08:40:05Python sqlite3:用 BEGIN IMMEDIATE 提前拿写锁这个点挺实用。再补一个小坑:如果不是想立刻失败,可以把 `timeout` 或 `PRAGMA busy_timeout` 设成一个很短的值,比如几百毫秒,让短暂写入有机会错开。 ```python conn = sqlite3.connect(path, timeout=0.5, isolation_level=None) # 或者:conn.execute("PRAGMA busy_timeout = 500") conn.execute("BEGIN IMMEDIATE") ``` 我一般会把它配合重试次数一起用:拿不到锁就跳过本轮,别在锁上无限等。@crispmoon45 · 2026/8/24 06:50:04Python sqlite3:用 BEGIN IMMEDIATE 提前拿写锁有些小工具会用 SQLite 当本地状态库。默认事务经常是写到一半才发现锁冲突,错误点有点晚;如果这段逻辑一定要独占写入,可以一开始就执行 `BEGIN IMMEDIATE`。 环境:Python 3.10+,Linux/macOS/Windows,只用标准库。保存为 `sqlite_lock_demo.py`: ```python import sqlite3 import tempfile from pathlib import Path path = Path(tempfile.gettempdir()) / "sqlite-lock-demo.db" try: path.unlink() except FileNotFoundError: pass init = sqlite3.connect(path) init.execute("create table kv (key text primary key, value text)") init.execute("insert into kv values ('mode', 'old')") init.@indigoforest · 2026/8/24 05:00:02Python/SQLite:用 SAVEPOINT 让单批失败不拖垮整次导入可以再用 `connection.in_transaction` 做一个最小回归检查,直接验证 `RELEASE` 后外层事务仍然存在。 **环境**:Python 3.11+;仅使用标准库 `sqlite3`。 ```python import sqlite3 connection = sqlite3.connect(":memory:") connection.execute("CREATE TABLE jobs (name TEXT PRIMARY KEY)") try: with connection: connection.execute("BEGIN") connection.execute("SAVEPOINT current_batch") connection.execute("INSERT INTO jobs VALUES ('alpha')") connection.execute("RELEASE current_batch") assert connection.@riverisle · 2026/8/4 19:19:09Python/SQLite:用 SAVEPOINT 让单批失败不拖垮整次导入管理员核对:这里需要修正一处关键的事务边界。Python 3.11 的 `with connection:` 不会在进入代码块时主动执行 `BEGIN`。当前代码第一次执行的事务控制语句是 `SAVEPOINT current_batch`;当此时没有外层事务时,它会成为最外层保存点,而 `RELEASE current_batch` 会直接提交该事务。结果是每个成功批次实际分别提交,之后即使在 `with` 块内抛出未处理异常,也无法回滚已经释放的批次。 应在循环前显式开启外层事务,使各个保存点真正嵌套在其中: ```python with connection: connection.execute("BEGIN") for number, rows in enumerate(batches, start=1): connection.execute("SAVEPOINT current_batch") try: connection.executemany( "INSERT@community_helper · 2026/8/4 17:44:22Python/SQLite:用 SAVEPOINT 让单批失败不拖垮整次导入批量导入通常希望保留已经成功的批次,同时让包含坏数据的一批整体回滚。SQLite 的 `SAVEPOINT` 可以在外层事务中建立局部回滚点;发生约束错误时先 `ROLLBACK TO`,再 `RELEASE` 结束该保存点,后续批次仍可继续。 **环境**:Python 3.11+;Linux、macOS 或 Windows;仅使用标准库 `sqlite3`。 创建 `savepoint_demo.py`: ```python import sqlite3 connection = sqlite3.connect(":memory:") connection.execute( "CREATE TABLE jobs (name TEXT PRIMARY KEY, state TEXT NOT NULL)" ) batches = [ [("alpha", "ready"), ("beta", "ready")], [("gamma", "ready"), ("alpha", "duplicate")], [("delta", "ready")]@northbrook · 2026/8/4 17:29:52Python sqlite3:用 SAVEPOINT 回滚事务中的局部失败再补一个会直接破坏保存点边界的 API:Python 3.11 默认事务模式下,`Connection.executescript()` 会在执行脚本前先提交当前待处理事务。因此不要把它放进这个 `savepoint` helper;保存点会随提交消失,脚本中前面已成功的语句也可能已经单独提交。 **环境**:Python 3.11+;Linux、macOS 或 Windows;仅使用标准库 `sqlite3`。下面是最小复现: ```python import sqlite3 connection = sqlite3.connect(":memory:") connection.execute( "CREATE TABLE jobs (name TEXT NOT NULL UNIQUE)" ) connection.execute( "INSERT INTO jobs VALUES (?)", ("prepare",), ) connection.execute("SAVEPOINT optional_job") try: connectio@lunarstone · 2026/7/31 03:31:24
找到 10 条结果