
使用 aiosqlite 时,执行 INSERT 等写操作后必须显式调用 commit(),否则更改仅存在于事务中,程序退出或连接关闭后将自动回滚,导致数据“看似消失”。
使用 aiosqlite 时,执行 insert 等写操作后必须显式调用 `commit()`,否则更改仅存在于事务中,程序退出或连接关闭后将自动回滚,导致数据“看似消失”。
在异步 SQLite 操作中,aiosqlite 的行为与标准 sqlite3 一致:所有 DML(如 INSERT、UPDATE、DELETE)操作默认运行在隐式事务中,但不会自动提交。你当前的 add_user 方法中调用了 cursor.execute(),却未提交事务,因此数据从未真正写入磁盘——连接关闭时事务被静默回滚,故无报错也无数据。
✅ 正确做法是:在 execute() 后调用 con.commit()(注意是连接对象 con,而非游标 cursor)。同时,推荐使用 con.execute() 替代手动创建游标,更简洁且语义清晰:
Android使用SQLite数据库进行开发的教程,chm格式,SQLite 是一款非常流行的嵌入式数据库,它支持 SQL 查询,并且只用很少的内存。Android 在运行时集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。对数熟悉 SQL 的开发人员来时,使用 SQLite 相当简单。可以,由于 JDBC 不适合手机这种内存受限设备,所以 Android 开发人员需要学习新的 API 来使用 SQLite。本文主要讲解 SQLite 在 Android 环境中的基
async def add_user(self, uid: int) -> None:
'''The method adds a user into the table'''
await self.start() # 确保表已存在
async with aiosql.connect(self.path) as con:
request = 'INSERT INTO users(user_telegram_id, status) VALUES(?, ?)'
await con.execute(request, (uid, 'member'))
await con.commit() # ✅ 关键:显式提交事务
⚠️ 注意事项:
- 不要对只读查询(如 SELECT)调用 commit();
- 若使用 async with aiosql.connect(...) as con:,连接会在退出上下文时自动关闭,但不自动提交;
- 若需批量插入,可复用同一连接并统一提交,提升性能;
- 更健壮的做法是捕获异常并回滚:
try: await con.execute("INSERT ...", (uid, "member")) await con.commit() except Exception as e: await con.rollback() raise e
总结:aiosqlite 不是“自动提交”的 ORM,而是异步封装的底层接口。牢记「执行 + 提交」两步缺一不可,这是与同步 sqlite3 的核心行为一致性体现,而非 bug。










