20181005:python遍歷查詢資料庫所有表名和欄位,使用SQLAlchemy查詢所有表名
阿新 • • 發佈:2018-12-13
用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,提高程式設計效率。