안티 발사 데이터베이스 테이블 내부에 SQLAlchemy의 기반으로 모델, 다음 쿼리를 사용하는 방법

테이블 내부 SQLAlchemy의 매핑 데이터베이스에 대해, 정상적인 상황에서 우리는 테이블 내부 데이터베이스를지도 할 수있는 모델을 정의 할 필요가있다. 그러나 데이터베이스 테이블 내부에 많은 시간이 많은 필드가 정의되고, 모델을 정의 할뿐만 아니라 데이터 ORM 구문을 찾기 위해 그것을 사용하지 있는가?

분명히 우리가 내 로컬 데이터베이스에 모두의 첫 번째 시도 와서, 두 테이블의 총, 테이블은 다른는 정보를 원하시면이라고, 여자라고.

# -*- 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 女

더 테이블, 다음, 우리는 지정할 수없는 경우, 그것은 테이블을 모두 인수 할 예정

# -*- 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://dev:[email protected]:5dsa3/metro")
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)
    """
    阙海云 TH021310 01010003703 信号工
    严旻炜 TH021310 01010009076 信号工
    黄雯婷 TH021310 01010003624 信号工
    张翥婧 TH220002 01010002897 商务管理
    钱林军 TH021310 01010003028 信号副班组长
    赵秋蓉 TH150002 01010003089 副班组长
    余静 TH150002 01010008497 副班组长
    付洋 TH150002 01010003919 副班组长
    徐倩玉 TH021310 01010009096 信号工
    吴绮平 TH01- 01010002871 副经理
    """

그러나이 방법은 권장하지 않습니다, 첫 번째 방법은 간단했고, 소스 코드를 어떤 경고를 보지 못했어요하기로 경고가 나타납니다뿐만 아니라, 불분명하다. 그러나, 상기 방법은 전혀 문제뿐만 아니라 높은 효율 없습니다. 그것없이, 모든 테이블을지도하기 때문에 그냥 데이터베이스 테이블 및 더 많은 내부에만 매개 변수를 추가해야합니다

이 특정 테이블, 그리고 여부를 결정 SQLAlchemy의 사용 방법 현재 데이터베이스 스키마에서 현재 스키마 쿼리의 모든 테이블에있는

from sqlalchemy import create_engine

engine = create_engine("postgresql://dev:[email protected]/metro")
print(engine.has_table(table_name="staff", schema="th"))  # True

all_tables = engine.table_names(schema="th")  # True
print(all_tables)
"""
['staff_detail', 'image_base_config', 'patrol', 
'attendance_config', 'new_org', 'attendance_daily', 
'attendance_monthly', 'staff', 'post', 'order_config',
'order', 'construction_plan', 'patrol_config', 
'record_detail', 'record_info', 'documentary_config', 
'degree', '_attendance_original_import', 'attendance_original', 
'org2', '_ceshi', 'org2_bak', '_dingding_dep', 
'org_copy1', 'org', 'org2_bak1']
"""
print("staff" in all_tables)  # True

추천

출처www.cnblogs.com/traditional/p/11345422.html