使用sqlalchemy獲取到的結果只包含數據,不包含字段,那么我們如何獲取到對應字段和其屬性呢?以及如何獲取某張表的主鍵呢?
# -*- coding:utf-8 -*-
# @Author: WanMingZhu
# @Date: 2019/9/11 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 注釋:英雄的國籍
"""