如何使用sqlalchemy获取表的主键、以及每个字段名和对应类型

<b><font size=3 color="green">使用sqlalchemy获取到的结果只包含数据,不包含字段,那么咱们如何获取到对应字段和其属性呢?以及如何获取某张表的主键呢?</font></b>python

# -*- coding:utf-8 -*-
# @Author: WanMingZhu
# @Date: 2019/10/9 10:38
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import MetaData, inspect, create_engine

engine = create_engine("postgresql://postgres:zgghyys123@localhost:5432/postgres")
session = sessionmaker(bind=engine)()

# 将数据库的表反射出来
metadata = MetaData(bind=engine)
metadata.reflect(bind=engine, schema="anime", only=["overwatch"])
Base = automap_base(metadata=metadata)
Base.prepare()

# ow就是overwatch表对应的类
ow = getattr(Base.classes, "overwatch")

# 获取主键
primary_key = inspect(ow).primary_key

print(primary_key)  # (Column('id', INTEGER(), table=<overwatch>, primary_key=True, nullable=False),)
# 因为会有多个主键,因此是一个序列。这里咱们只有一个主键,因此取第一个,而后拿到名字
print(primary_key[0].name)  # id

# 那么如何拿到表的全部字段名呢?
print(inspect(ow).c.keys())  # ['id', 'name', 'age', 'hp', 'attack', 'role', 'ultimate', 'country']

# 那如何拿到字段的类型呢?
columns = inspect(ow).columns
print(list(columns))
"""
[Column('id', INTEGER(), table=<overwatch>, primary_key=True, nullable=False), 
Column('name', VARCHAR(length=255), table=<overwatch>, nullable=False), 
Column('age', INTEGER(), table=<overwatch>), Column('hp', INTEGER(), table=<overwatch>), 
Column('attack', VARCHAR(length=255), table=<overwatch>), 
Column('role', VARCHAR(length=255), table=<overwatch>), 
Column('ultimate', VARCHAR(length=255), table=<overwatch>), 
Column('country', VARCHAR(), table=<overwatch>)]
"""
# 以上即是每个字段的属性组成的列表,每个元素都是<class 'sqlalchemy.sql.schema.Column'>类型
# 那么咱们即可以拿到相应的属性
for col_attr in columns:
    print(f"字段名:{col_attr.name},"
          f"是否为主键:{col_attr.primary_key},"
          f"字段类型:{str(col_attr.type)},"
          f"是否容许非空:{col_attr.nullable}",
          f"注释:{col_attr.comment}")
"""
字段名:id,是否为主键:True,字段类型:INTEGER,是否容许非空:False 注释:英雄的id
字段名:name,是否为主键:False,字段类型:VARCHAR(50),是否容许非空:False 注释:英雄的姓名
字段名:age,是否为主键:False,字段类型:INTEGER,是否容许非空:True 注释:英雄的年龄
字段名:hp,是否为主键:False,字段类型:INTEGER,是否容许非空:True 注释:英雄的血量
字段名:attack,是否为主键:False,字段类型:VARCHAR(255),是否容许非空:True 注释:攻击类型
字段名:role,是否为主键:False,字段类型:VARCHAR(255),是否容许非空:True 注释:英雄定位
字段名:ultimate,是否为主键:False,字段类型:VARCHAR(255),是否容许非空:True 注释:终极技能
字段名:country,是否为主键:False,字段类型:TEXT,是否容许非空:True 注释:英雄的国籍
"""