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)
#获取数据库中的所有表
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=, primary_key=True, nullable=False), Column('name', VARCHAR(), table=), Column('fullname', VARCHAR(), table=), Column('password', VARCHAR(), table=), schema=None)})
比如:
# tables 返回的结果,其中包含了:user、serlog、tag三个表
immutabledict({
'user': Table('user', MetaData(bind=None), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('name', String(length=100), table=), Column('pwd', String(length=100), table=), Column('email', String(length=100), table=), Column('phone', String(length=11), table=), Column('info', Text(), table=), Column('face', String(length=255), table=), Column('addtime', DateTime(), table=, default=ColumnDefault(datetime.datetime(2018, 10, 5, 18, 20, 9, 500177))), Column('uuid', String(length=255), table=), schema=None), 'userlog': Table('userlog', MetaData(bind=None), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('user_id', Integer(), ForeignKey('user.id'), table=), Column('ip', String(length=100), table=), Column('addtime', DateTime(), table=, default=ColumnDefault(datetime.datetime(2018, 10, 5, 18, 20, 9, 510654))), schema=None), 'tag': Table('tag', MetaData(bind=None), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('name', String(length=100), table=), Column('addtime', DateTime(), table=, 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)
下面是百度找来的回答:
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