How to use sqlalchemy get table's primary key, and each field name

Use sqlalchemy to get the results contain only data, not the fields, then how do we get it to the corresponding fields? And how to obtain the primary key of a particular table it?

from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import MetaData, inspect, create_engine

engine = create_engine("postgresql://postgres:******@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


# 如何获取字段名呢?
res = session.query(ow).selectable.columns
print(res)
"""
['anime_overwatch_id', 'anime_overwatch_name', 'anime_overwatch_age', 
'anime_overwatch_hp', 'anime_overwatch_attack', 'anime_overwatch_role', 
'anime_overwatch_ultimate', 'anime_overwatch_country']
"""
# 可以看到,会自动将schema、table_name、column用_进行拼接,准确的说这不是字段名,而是在查询字段的时候起的别名
# 对于单表来说,也可以得出字段名,直接以最后一个下划线进行分割,然后取最后一个元素即可
# 记得要转化成str类型
print([str(r).rsplit("_")[-1] for r in res])  # ['id', 'name', 'age', 'hp', 'attack', 'role', 'ultimate', 'country']

Guess you like

Origin www.cnblogs.com/traditional/p/11505189.html