20181005:python遍历查询数据库全部表名和字段,使用SQLAlchemy查询全部表名

用sqlalchemy模块的方法(网上都是这个方法):

from sqlalchemy import Column, String, create_engine
    from sqlalchemy.ext.declarative import declarative_base
    
    engine = create_engine('sqlite:///path',echo=True)        # 建立数据库链接
    Base = declarative_base()        
    Base.metadata.reflect(engine)        
    tables = Base.metadata.tables        
    print(tables)

用flask_sqlalchemy模块的方法

#获取数据库中的全部表
	from flask import Flask
	from flask_sqlalchemy import SQLAlchemy
	import pymysql
	app = Flask(__name__)  # 实例化一个Flask
	#链接数据库配置: SQLALCHEMY_DATABASE_URI。
	app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:root@127.0.0.1:8889/movie"
	app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True
	app.config["SECRET_KEY"] = "1e3df42bbfe146c785f422611d6e7429"
	app.debug = True
	
	db = SQLAlchemy(app)  # 初始化数据库
    db.reflect(app=app)     #一、映射app数据库中的表(app其实就是本程序的flask实例,已链接到数据库)
    tables=db.metadata.tables   #二、取得全部数据库(返回:immutabledict,里面实际包含了数据库中全部表的结构
    print(tables)

上面无论哪一种模式,得到的tables都是一个immutabledict,格式以下:html

immutabledict({'users': Table('users', MetaData(bind=None), Column('id', INTEGER(), table=<users>, primary_key=True, nullable=False), Column('name', VARCHAR(), table=<users>), Column('fullname', VARCHAR(), table=<users>), Column('password', VARCHAR(), table=<users>), schema=None)})

好比:mysql

# tables 返回的结果,其中包含了:user、serlog、tag三个表
immutabledict({
'user': Table('user', MetaData(bind=None), Column('id', Integer(), table=<user>, primary_key=True, nullable=False), Column('name', String(length=100), table=<user>), Column('pwd', String(length=100), table=<user>), Column('email', String(length=100), table=<user>), Column('phone', String(length=11), table=<user>), Column('info', Text(), table=<user>), Column('face', String(length=255), table=<user>), Column('addtime', DateTime(), table=<user>, default=ColumnDefault(datetime.datetime(2018, 10, 5, 18, 20, 9, 500177))), Column('uuid', String(length=255), table=<user>), schema=None), 'userlog': Table('userlog', MetaData(bind=None), Column('id', Integer(), table=<userlog>, primary_key=True, nullable=False), Column('user_id', Integer(), ForeignKey('user.id'), table=<userlog>), Column('ip', String(length=100), table=<userlog>), Column('addtime', DateTime(), table=<userlog>, default=ColumnDefault(datetime.datetime(2018, 10, 5, 18, 20, 9, 510654))), schema=None), 'tag': Table('tag', MetaData(bind=None), Column('id', Integer(), table=<tag>, primary_key=True, nullable=False), Column('name', String(length=100), table=<tag>), Column('addtime', DateTime(), table=<tag>, default=ColumnDefault(datetime.datetime(2018, 10, 5, 18, 20, 9, 510654))), schema=None) })

经测试这个immutabledict没有has_key()方法,可是能够用if ‘users’ in tables.keys()判断。以上获得的tables包括表名、字段名、字段类型、字符格式等,若是仅打印 engine.table_names() 时它列出的全部表名(仅仅只有表名)。web

若是要分离tables的数据,使用re 模块对字符串操做便可,如:sql

import re
    # 获取数据库中的全部表
    db.reflect(app=app)     #一、映射app数据库中的表(app其实就是本程序的flask实例,已链接到数据库)
    tables=db.metadata.tables   #二、取得全部数据库(返回:immutabledict,里面实际包含了数据库中全部表的结构
    print(tables)
    table_list = re.findall("\'.*?\'", str(tables))   #三、找到全部在两个小撇中间的字符(包括表名称和字段名称,其实应该找"两个小撇+:"的,才是表名称,但不会正则)
    print(table_list)
    table_list = [re.sub("'", '', each) for each in table_list]     #替换掉双引号
    print(table_list)

附:flask-sqlalchemy 和sqlalchemy的关系是什么?

下面是百度找来的回答:
It aims to simplify using SQLAlchemy with Flask by providing useful
defaults and extra helpers that make it easier to accomplish common
tasks. (官网原文)
flask-sqlalchemy 在 sqlalchemy 的基础上,提供了一些经常使用的工具,并预设了一些默认值,帮助你更轻松地完成常见任务。
flask-sqlalchemy 用起来比直接用 sqlalchemy 方便、省事,不过有些高级一点的功能若是不了解 sqlalchemy 的话会用很差。
因此我的建议最好先直接用 sqlalchemy 工做一小段时间,感觉一下 sqlalchemy 究竟是怎样运行起来的。等有了必定了解后,若是以为有必要,再改用 flask-sqlalchemy,提升编程效率。数据库

官方的英文文档:
https://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/api.html#sqlalchemy.ext.declarative.DeferredReflection编程