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:[email protected]:8889/movie"
	app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True
	app.config["SECRET_KEY"] = "1e3df42bbfe146c785f422611d6e7429"
	app.debug = True
	
	db = SQLAlchemy(app)  # 初始化数据库
    db.reflect(app=app)     #1、映射app数据库中的表(app其实就是本程序的flask实例,已连接到数据库)
    tables=db.metadata.tables   #2、取得所有数据库(返回:immutabledict,里面实际包含了数据库中所有表的结构
    print(tables)

上面不管哪种模式,获得的tables都是一个immutabledict,格式如下:

 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)})

比如:

# 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() 时它列出的所有表名(仅仅只有表名)。

如果要分离tables的数据,使用re 模块对字符串操作即可,如:

	import re
    # 获取数据库中的所有表
    db.reflect(app=app)     #1、映射app数据库中的表(app其实就是本程序的flask实例,已连接到数据库)
    tables=db.metadata.tables   #2、取得所有数据库(返回:immutabledict,里面实际包含了数据库中所有表的结构
    print(tables)
    table_list = re.findall("\'.*?\'", str(tables))   #3、找到所有在两个小撇中间的字符(包括表名称和字段名称,其实应该找"两个小撇+:"的,才是表名称,但不会正则)
    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

猜你喜欢

转载自blog.csdn.net/zyself/article/details/82945576