1. 程式人生 > >20181005:python遍歷查詢資料庫所有表名和欄位,使用SQLAlchemy查詢所有表名

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,提高程式設計效率。