使用 dict 方法
这种方式的不需要模型配合,便可以直接把查询数据转为字典。不过对 sqlalchemy 来讲字典中会多一个 _sa_instance_state 需要移除。
def get(self, table, column, value) -> dict:
""" 获取单条信息"""
with self.session.begin() as session:
table_column = getattr(table, column)
stmt = select(table).where(table_column == value)
result = session.execute(stmt).scalar()
if not result:
return {}
result = result.__dict__ # 转为字典
if "_sa_instance_state" in result:
del result["_sa_instance_state"] # 删除指定键
return result
使用 dict 方法
def get(self, table, column, value) -> dict:
""" 获取单条信息"""
with self.session.begin() as session:
table_column = getattr(table, column)
stmt = select(table).where(table_column == value)
result = session.execute(stmt).scalar()
if not result:
return {}
return dict(result)
使用函数
可以自定义需要返回的数据,甚至是可以
class Infos(Base, GetDict):
name = Column(String(32))
age = Column(Integer)
def to_dict(self):
return {
"name": self.name,
"age": self.age,
}
模版
class GetDict:
def keys(self):
k_list = []
for key in self.__mapper__.c.keys():
k_list.append(key)
return k_list
def __getitem__(self, item):
return getattr(self, item)
对应模型
class Infos(Base, GetDict):
name = Column(String(32))
age = Column(Integer)
调用
infos = Infos()
print(dict(infos))
调用时需要使用 dict
。
分表
class Test():
def model(suffix):
tablename = f"test{suffix}"
classname = f"test{suffix}"
# 这里也可以传递上面的 GetDict
Model = type(classname, (Base, ), {
'__module__': __name__,
'__name__': classname,
'__tablename__': tablename,
"id" : Column(String(36), primary_key=True,
default=str(uuid.uuid4())),
"name": Column(Integer),
"create_time" : Column(DateTime, server_default=func.now(),
comment="创建时间"),
"update_time" : Column(DateTime, server_default=func.now(),
onupdate=func.now(),
comment='修改时间'),
})
return Model
调用
# model 返回的便是类(表模型)
model = Test.model("42")
db.get_all(model, {})