from datetime import datetime
from sqlmodel import SQLModel, Field, Session, create_engine, select
class Table1(SQLModel, table=True):
__tablename__ = 'Table1'
id: int = Field(default=None, primary_key=True)
timestamp: datetime = Field(default_factory=datetime.now)
data: str | None = Field()
class Table2(SQLModel, table=True):
__tablename__ = 'Table2'
id: int = Field(default=None, primary_key=True)
timestamp: datetime = Field(default_factory=datetime.now)
data: str | None = Field()
TableT = Table1 | Table2
class DatabaseORM:
def __init__(self, path: str):
'''
初始化数据库 ORM
:param path: 数据库路径
'''
self.engine = create_engine(f'sqlite:///{path}')
SQLModel.metadata.create_all(self.engine)
def add(self, data: TableT) -> None:
'''
向表中新增一行数据
:param data: 新增数据
'''
with Session(self.engine) as session:
session.add(data)
session.commit()
def add_many(self, datas: list[TableT]) -> None:
'''
向表中新增多行数据
:param datas: 新增数据列表
'''
with Session(self.engine) as session:
session.add_all(datas)
session.commit()
def query(self, table: type[TableT], where) -> TableT | None:
'''
查询表数据
:param table: 表模型
:param where: 查询条件
:return 若存在数据则返回该数据模型,若无数据则返回 None
'''
with Session(self.engine) as session:
statement = select(table).where(where)
results = session.exec(statement)
return results.first()
def update_data(self, table: type[TableT], where, new_data: TableT) -> None:
'''
按条件更新表中的字段
:param table: 表模型
:param where: 查询条件
:param new_data: 新数据
'''
with Session(self.engine) as session:
statement = select(table).where(where)
results = session.exec(statement)
data = results.first()
updates = new_data.model_dump(exclude_unset=True, exclude={'id'})
for k, v in updates.items():
setattr(data, k, v)
session.add(data)
session.commit()
def update_value(self, table: type[TableT], where, key: ..., value: ...) -> None:
'''
按条件更新表中字段的值
:param table: 表模型
:param where: 查询条件
:param key: 更新字段
:param value: 更新值
'''
with Session(self.engine) as session:
statement = select(table).where(where)
results = session.exec(statement)
field = results.first()
setattr(field, key.key, value)
session.add(field)
session.commit()
def get_table(self, table: type[TableT]) -> list[TableT]:
'''获取整张表的数据'''
with Session(self.engine) as session:
statement = select(table)
results = session.exec(statement)
return results.all()
def close(self):
'''关闭引擎'''
self.engine.dispose()
if __name__ == '__main__':
databaseORM = DatabaseORM(path='database.db')