SQLAlchemy插入SQLite数据未持久化,切换PostgreSQL正常
解决SQLAlchemy向SQLite插入数据不保存的问题
针对你遇到的SQLite插入数据不生效但PostgreSQL正常的情况,可从以下几个方面排查修复:
1. 避免重复初始化引擎与会话
你的代码每次调用add_values都会重新创建engine和Session,这会导致SQLite文件连接频繁重建,引发事务同步问题。把引擎和会话的定义移到函数外部:
# 模块全局定义,仅初始化一次 engine = create_engine("sqlite:///mydb.db", echo=True, check_same_thread=False) Base.metadata.create_all(bind=engine) Session = sessionmaker(bind=engine) def add_values(offers): with Session.begin() as session: list_of_offers = [] for ele in offers: offer = Offer( ele.id, ele.asin, ele.price, ele.currency, ele.condition, ele.seller, ele.datetime, ele.buyboxWinner, ele.numberOfSellers ) list_of_offers.append(offer) session.add_all(list_of_offers) # 无需手动调用commit,Session.begin()上下文会自动提交
2. 添加SQLite线程安全参数
SQLite默认不允许跨线程共享连接,若你的代码是多线程调用add_values,必须给create_engine加上check_same_thread=False参数,否则会导致连接异常,数据无法写入。
3. 移除多余的手动commit
with Session.begin() as session的上下文管理器已经会在代码块正常执行完毕后自动提交事务,异常时自动回滚。手动调用session.commit()属于重复操作,可能干扰SQLite的事务处理流程。
4. 验证文件路径与权限
- 确认
mydb.db的路径是否正确:如果是相对路径,检查当前工作目录是否和预期一致,也可以改用绝对路径(比如sqlite:///C:/projects/mydb.db或sqlite:////home/user/mydb.db)避免路径错误。 - 检查文件所在目录的写入权限,确保当前用户有权限修改该文件。
额外验证:Offer模型主键定义
确保Offer模型的主键字段配置正确,若使用自增主键,需明确标注:
class Offer(Base): __tablename__ = 'offers' id = Column(Integer, primary_key=True, autoincrement=True) # 其他字段定义...
内容的提问来源于stack exchange,提问作者MrRementer
相关产品推荐
相关产品推荐

