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

2022-10-27

使用 dict 方法

这种方式的不需要模型配合,便可以直接把查询数据转为字典。不过对 [[sqlalchemy]] 来讲字典中会多一个 _sa_instance_state 需要移除。

1
def get(self, table, column, value) -> dict:
2
""" 获取单条信息"""
3
4
with self.session.begin() as session:
5
table_column = getattr(table, column)
6
stmt = select(table).where(table_column == value)
7
result = session.execute(stmt).scalar()
8
9
if not result:
10
return {}
11
12
result = result.__dict__ # 转为字典
13
14
if "_sa_instance_state" in result:
15
del result["_sa_instance_state"] # 删除指定键
16
17
return result

使用 dict 方法

1
def get(self, table, column, value) -> dict:
2
""" 获取单条信息"""
3
4
with self.session.begin() as session:
5
table_column = getattr(table, column)
6
stmt = select(table).where(table_column == value)
7
result = session.execute(stmt).scalar()
8
9
if not result:
10
return {}
11
12
return dict(result)

使用函数

可以自定义需要返回的数据,甚至是可以

1
class Infos(Base, GetDict):
2
name = Column(String(32))
3
age = Column(Integer)
4
5
def to_dict(self):
6
return {
7
"name": self.name,
8
"age": self.age,
9
}

模版

1
class GetDict:
2
3
def keys(self):
4
k_list = []
5
for key in self.__mapper__.c.keys():
6
k_list.append(key)
7
return k_list
8
9
def __getitem__(self, item):
10
return getattr(self, item)

对应模型

1
class Infos(Base, GetDict):
2
name = Column(String(32))
3
age = Column(Integer)

调用

1
infos = Infos()
2
print(dict(infos))

调用时需要使用 dict

分表

1
class Test():
2
def model(suffix):
3
tablename = f"test{suffix}"
4
classname = f"test{suffix}"
5
6
# 这里也可以传递上面的 GetDict
7
Model = type(classname, (Base, ), {
8
'__module__': __name__,
9
'__name__': classname,
10
'__tablename__': tablename,
11
12
"id" : Column(String(36), primary_key=True,
13
default=str(uuid.uuid4())),
14
"name": Column(Integer),
15
"create_time" : Column(DateTime, server_default=func.now(),
16
comment="创建时间"),
17
"update_time" : Column(DateTime, server_default=func.now(),
18
onupdate=func.now(),
19
comment='修改时间'),
20
})
21
22
return Model

调用

1
# model 返回的便是类(表模型)
2
model = Test.model("42")
3
db.get_all(model, {})

参考