SQLAlchemy 查询返回字典的两种方法

2022-10-27

使用 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, {})

参考