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

参考