使用sqlalchemy的ORM样式反射存在的表

创建数据库与sqlalchemy的映射

SQLAlchemy提供automap_base,实现数据库与sqlalchemy ORM的映射

from sqlalchemy.ext.automap import automap_base
engine = create_engine("mysql+pymysql://user:password@ip/database_name?charset=utf8")

Base = automap_base()
Base.prepare(engine)

创建数据表反射的ORM

# 方式一:Base.classes.表名
# Person = Base.classes.account_capchem

# 方式二:Base.classes["表名"]
Person = Base.classes["account_capchem"]

扩展为什么可以使用这两种方式

分析源码

  • 打印Base.classes类型,等到<class 'sqlalchemy.util._collections.Properties'>
  • 查看Properties类源码
class Properties(Generic[_T]):
    """Provide a __getattr__/__setattr__ interface over a dict."""

    __slots__ = ("_data",)

    _data: Dict[str, _T]

    def __init__(self, data: Dict[str, _T]):
        object.__setattr__(self, "_data", data)
    """
    此处省略后面的代码
    Properties类的路径:from sqlalchemy.util import Properties
    """
  • 从源码可知Properties类初始化需要一个字典对象,定义一个Test类继承Properties
from typing import Dict

from sqlalchemy.util import Properties


class Test(Properties):
    def __init__(self, data: Dict):
        super().__init__(data)

if __name__ == '__main__':
    test = Test(dict(name="test", aaa=100))
    print(test.get("name")) # test
    print(test.name) # test
  • 总结:可知是这个类帮我们实现可以使用以上两种方式获取数据库中表与ORM类的映射

使用数据表映射出来的ORM查询数据表

from sqlalchemy import create_engine
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import Session

engine = create_engine("mysql+pymysql://user:password@ip/database_name?charset=utf8")

Base = automap_base()
Base.prepare(engine)
# Person = Base.classes.person
Person = Base.classes["person"]

print(Person, type(Person))
print(Base.classes.keys())
print(type(Base.classes))

session = Session(engine)
data = session.query(Person).all()
print([{"id": i.id, "name": i.name, "age": i.age, "sex": i.sex} for i in data])

发散思考

Base.classes有哪些key?这些key与数据表有什么关系

ks = Base.classes.keys()
print(ks)

结果发现ks是数据库所有表的名称的列表。不包含数据库的视图!

  • 18
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hzw0510

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值