sqlalchemy&sqlmodel的commit后数据丢失问题

描述 print(user) # name=user,age=18, ... session.commit() print(user) # empty 原因 sqlalchemy为了保持session内的数据同步,默认了expire_on_commit为True,它表现在: # 查询 b = session.query(User).filter(User.id==2).first() # 更改数据 b.name = "user_b" session.add(b) session.flush() session.commit() # commit后再次访问,其实是重新进行了select操作 b.name # user_b expire_on_commit可以用来更改 SQLAlchemy 的对象刷新机制,默认值为True即在session调用commit之后会主动将同一个session在commit之前查询得到的 ORM 对象的_sa_instance_state.expire属性设置为Flase,再次读取该对象属性时将重载这个对象,方法是重新调用之前的查询语句。 ...

2023-03-11 · 1 min · 366 words · kutake

sqlmodel单与多数据库连接

连接单个数据库 from typing import Optional from sqlmodel import Field, Session, SQLModel, create_engine # 表 class Hero(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) name: str secret_name: str age: Optional[int] = None # 连接 engine = create_engine("sqlite:///database.db") # 建表 SQLModel.metadata.create_all(engine) 连接多个数据库 from typing import Optional from sqlmodel import Field, Session, SQLModel, create_engine from sqlmodel.main import registry # 表1 table1 = registry() class Hero1(SQLModel, table=True, registry=table1): id: Optional[int] = Field(default=None, primary_key=True) name: str secret_name: str age: Optional[int] = None # 表2 table2 = registry() class Hero2(SQLModel, table=True, registry=table2): id: Optional[int] = Field(default=None, primary_key=True) name: str secret_name: str age: Optional[int] = None # 连接1 engine1 = create_engine("sqlite:///database1.db") # 连接2 engine2 = create_engine("sqlite:///database2.db") # 建表1 Hero1.metadata.create_all(engine1) # 建表2 Hero2.metadata.create_all(engine2) 一点优化 显然这样建多表会很麻烦,一种优化方案是: ...

2023-03-11 · 1 min · 279 words · kutake