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

本文介绍如何使用SQLAlchemy、Flask_SQLAlchemy和Flask框架获取数据库中的所有表名及结构,对比了不同方法的优劣,并解释了flask_sqlalchemy与sqlalchemy的关系。
部署运行你感兴趣的模型镜像

sqlite3 直接获取

import sqlite3
conn=sqlite3.connect('mydb.db')
cu=conn.cursor()
#获取表名,保存在tab_name列表
cu.execute("select name from sqlite_master where type='table'")
tab_name=cu.fetchall()
tab_name=[line[0] for line in tab_name]

用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)     #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

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值