使用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 注释:英雄的国籍
"""

最新文章

  1. 数据结构之列表-javascript实现
  2. JSP前三章测试改错
  3. 英雄联盟网络测速 v1.3 全服全区取延时+取服务器维护状态+机房地理位置
  4. iOS 7 UI Transition – Porting View Controller Layouts from iOS 6
  5. Access restriction: The type &#39;RSACipher&#39; is not API
  6. Dapper基础用法
  7. 年度十佳 DevOps 博客文章(后篇)
  8. host字段变复杂了
  9. Android源代码学习之六——ActivityManager框架解析
  10. HDU 2841 Visible Trees(数论)
  11. 浅谈IOS8之size class 分类: ios技术 2015-02-05 19:06 62人阅读 评论(0) 收藏
  12. Maven-11: 从命令行调用插件
  13. mybatis 的sql语句及使用mybatis的动态sql mybatis防注入
  14. Newton方法
  15. python冒泡排序法
  16. Linux的软中断处理实现 【转】
  17. day 33js 后续 函数.对象
  18. 让ASP.NET OutputCache使用http.sys kernel-mode cache
  19. mfc &quot;缺少函数标题(是否是老式的形式表)&quot;的总结
  20. Oracle的日志记录模式

热门文章

  1. 网络通信框架之retrofit
  2. android dialog使用自定义布局 设置窗体大小位置
  3. 如何解决使用 JMeter 时遇到的问题
  4. 2019.11.06 【每天学点SAP小知识】Day1 - ABAP 7.40新语法
  5. java浮点型数据保留两位小数
  6. gcc posix sjij for MSYS 9.2.1+
  7. /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15&#39; not found错误的解决 转载
  8. synchronized(三) 锁的膨胀过程(锁的升级过程)深入剖析
  9. Java基础(十)
  10. 小记---------spark优化之更优分配资源