zoukankan      html  css  js  c++  java
  • 如何使用sqlalchemy根据数据库里面的表反推出模型,然后进行查询

    关于sqlalchemy映射数据库里面的表,一般情况下我们是需要定义一个模型来映射数据库里面的表的。但是很多时候数据库里面的表都是定义好的,而且字段很多,那么有没有不定义模型,还能使用orm语法查找数据的方法呢?

    显然是可以的,下面我们就来试一下,首先在我本地的数据库一共有两张表,一张表叫做girls,另一张叫做info。

    # -*- coding:utf-8 -*-
    # @Author: WanMingZhu
    # @Date: 2019/8/13 11:32
    from sqlalchemy import MetaData
    from sqlalchemy import create_engine
    from sqlalchemy.ext.automap import automap_base
    from sqlalchemy.orm import sessionmaker
    
    # 定义引擎,不用说
    engine = create_engine("postgresql://postgres:zgghyys123@localhost:5432/postgres")
    # 绑定引擎,生成一个MetaData对象
    metadata = MetaData(bind=engine)
    # 通过engine将tables反射到meta上,指定schema,这里就是public,public的话在postgresql里面不需要指定,默认的
    # only参数则是提取我们指定的表
    metadata.reflect(engine, only=["girls"], schema="public")
    # 调用automap_base,传入metadata,从名字也能看出来,自动映射成类
    # 将metadata里面保存的表信息映射成Base
    Base = automap_base(metadata=metadata)
    # 调用prepare方法,设置被映射的类和关系
    Base.prepare()
    
    # 然后数据库里里面的表都被映射类之后,被保存在Base.classes下面,直接通过Base.classes.表名 即可得到模型
    # 比如我们的是girls表,那么获取对应的类,就可以使用Base.classes.girls,我们起名为Girls
    # 这个Girls和我们使用class Girls(Base):这种以前使用的方式得到的Girls是一样的
    # 只不过我们以前是先定义模型然后映射成表,这里是由表反过来推出模型
    Girls = Base.classes.girls
    
    # 那么就可以创建session了
    # 创建session的方式还是和以前一样,没什么区别
    Session = sessionmaker()
    session = Session(bind=engine)
    
    # 查询
    res = session.query(Girls).first()
    print(res.id, res.name, res.age, res.gender)  # 6 芙兰朵露斯卡雷特 495 女
    

    但是如果表比较多的话,我们也可以不指定only,那么就会获取全部的表

    # -*- coding:utf-8 -*-
    # @Author: WanMingZhu
    # @Date: 2019/8/13 11:32
    from sqlalchemy import MetaData
    from sqlalchemy import create_engine
    from sqlalchemy.ext.automap import automap_base
    from sqlalchemy.orm import sessionmaker
    
    engine = create_engine("postgresql://postgres:zgghyys123@localhost:5432/postgres")
    metadata = MetaData(bind=engine)
    # 不指定only
    metadata.reflect(engine, schema="public")
    Base = automap_base(metadata=metadata)
    Base.prepare()
    
    # 此时的Base.classes则是储存了数据库里面所有的表对应的模型
    Info = Base.classes.info
    
    Session = sessionmaker()
    session = Session(bind=engine)
    
    res = session.query(Info).first()
    print(res.id, res.anime, res.boyfriend)  # 2 樱花庄的宠物女孩 神田空太
    

    当然我们定义模型的方法,也可以进行大量的简化

    # -*- coding:utf-8 -*-
    # @Author: WanMingZhu
    # @Date: 2019/8/13 13:19
    from sqlalchemy import MetaData
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy import Table
    
    engine = create_engine("postgresql://xxxxx:xxxxxxxWdas123213213?@1xxxxxxxxxxx:xxxx/xxxxx")
    Base = declarative_base(bind=engine)
    metadata = MetaData(bind=engine)
    metadata.reflect(engine, schema="th")
    
    
    class Fucker(Base):
        # 以前指定__tablename__ = "staff"
        # 这里指定__table__ = Table("staff", metadata, autoload=True)
        __table__ = Table("staff", metadata, autoload=True, schema="th")
    
    
    Session = sessionmaker(bind=engine)
    session = Session()
    
    for res in session.query(Fucker)[: 10]:
        print(res.name, res.oid, res.id, res.post)
        """
        aaa 021310 01010003703 xhg
        bbb 021310 01010009076 xhg
        ccc 021310 01010003624 xhg
        ddd 220002 01010002897 xhg
        eee 021310 01010003028 xhg
        fff 150002 01010003089 xhg
        ggg 150002 01010008497 xhg
        hhh 150002 01010003919 xhg
        iii 021310 01010009096 xhg
        jjj 01- 01010002871 xhg
        """
    

    但是这种方式不推荐,不仅没有第一种方法简洁,而且会弹出警告,至于警告是什么,没看源码,目前还不清楚。但是上面的方法是绝对没有问题的,效率还高。只是数据库里面的表多了,记得加上only参数,因为不加的话,会映射所有的表

    如何使用sqlalchemy判断当前数据库的某个schema下是否存在某张表,以及查询当前schema下的所有表有哪些

    from sqlalchemy import create_engine
    
    engine = create_engine("postgresql://xxxxxxxx:Qxxxxxxxxxxxxxx3?@1xxxdasdsa2dxxxxxs2xx:xxxx3/mxxxxx")
    print(engine.has_table(table_name="staff", schema="th"))  # True
    
    all_tables = engine.table_names(schema="th")  # True
    print(all_tables)
    """
    ['staff', 'hahaha', 'gagaga']
    """
    print("staff" in all_tables)  # True
    
  • 相关阅读:
    2017python学习的第四天,生成器,装饰器迭代器
    2017python第三天作业
    2017python学习的第三天函数
    2017python学习的第三天文件的操作
    2017python第二天作业
    python第二天学了列表,字典和嵌套
    [Translation] Introduction to ASP.NET Core
    Create a private nuget server
    Cunningham's Law
    [转]Migrating HTTP handlers and modules to ASP.NET Core middleware
  • 原文地址:https://www.cnblogs.com/traditional/p/11345422.html
Copyright © 2011-2022 走看看