Flask SQLAlchemy 多数据库动态链接

在企业级应用里,常常需要连接多个分布在不同主机和地理位置的数据库实例。不同功能和模块要访问不同数据库,所以动态连接这些数据库很有必要。下面介绍如何用MySQL和Flask-SQLAlchemy实现这一功能。

安装和配置MySQL

首先要安装MySQL数据库。不同操作系统的安装步骤可能不同,通常包括:

• 下载MySQL二进制安装包或源代码

• 执行安装程序或编译源代码

• 配置MySQL服务参数,像网络端口号、数据库目录等

• 创建MySQL用户和数据库

• 启动MySQL服务

在Linux系统上,可以用这些命令安装MySQL并配置相关参数:

$ sudo apt-get update
$ sudo apt-get install mysql-server
$ sudo mysql_secure_installation
$ sudo systemctl start mysql

另外还需要安装MySQL的Python驱动程序,比如pymysql或mysql-connector-python等。

创建Flask应用程序

接下来创建基于Flask框架的应用程序,用Flask-SQLAlchemy插件连接MySQL数据库。可以创建一个基本的Flask应用程序,包含这些文件:

• app.py:定义应用程序,包括路由、数据库配置等

• models.py:定义ORM模型,包括数据库表和关系等

举个例子,可以创建一个名为“myapp”的应用程序,在“app.py”文件中定义路由和数据库配置:

from flask import Flask, jsonify
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db_uri = "mysql+pymysql://user:password@hostname/database"
app.config['SQLALCHEMY_DATABASE_URI'] = db_uri

db = SQLAlchemy(app)

@app.route('/')
def index():
    return jsonify({'message': 'Hello World!'})

if __name__ == '__main__':
    app.run(debug=True)

在上面的例子里,定义了一个基本的Flask应用程序,包含一个路由“/”和一个数据库连接配置。用pymysql作为MySQL的Python驱动程序,在“db_uri”变量中指定MySQL的连接参数。用Flask-SQLAlchemy插件连接到MySQL数据库,将其作为“db”对象使用。

动态连接到多个数据库

有了基本的Flask应用程序和MySQL连接配置后,就能开始动态连接到多个数据库了。实现这个功能需要做这些步骤:

• 定义多个数据库配置,包括主机名、数据库名、用户名、密码等信息

• 创建多个数据库连接,每个连接对应一个配置

• 将连接对象保存在一个字典中,方便在需要访问不同数据库时快速切换

下面是一个实现动态连接到三个MySQL数据库的例子:

from flask import Flask, jsonify
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import create_engine  # 注意补充导入create_engine

app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db_configs = {
    'db1': 'mysql+pymysql://user1:password1@hostname1/database1',
    'db2': 'mysql+pymysql://user2:password2@hostname2/database2',
    'db3': 'mysql+pymysql://user3:password3@hostname3/database3'
}

db_conns = {}
for db_name, db_uri in db_configs.items():
    db_conns[db_name] = SQLAlchemy(app)
    db_conns[db_name].engine.dispose()
    db_conns[db_name].engine = create_engine(db_uri)

@app.route('/db/<db_name>/table')
def get_table(db_name):
    conn = db_conns[db_name]
    table = conn.Table.query...  # 此处需根据实际表名和查询逻辑补充
    return jsonify({'result': table})

if __name__ == '__main__':
    app.run(debug=True)

在上面的例子中,定义了三个不同的MySQL数据库配置,分别对应“db1”“db2”“db3”三个名称。然后创建了三个Flask-SQLAlchemy连接对象,保存在名为“db_conns”的字典中。为避免连接池问题,用SqlAlchemy的create_engine()方法,以Python数据库驱动的uri字符串为参数,创建新的引擎对象让不同的线程使用不同的连接。

在路由函数中,用动态路由的方式,可以传入不同的数据库名称“db_name”和表名称“table”,根据传入的参数从“db_conns”字典中选择相应的连接对象。然后可以用ORM查询方法“Table.query”访问所选择的数据库表,将结果返回为json形式。

通过上面的步骤,能在Flask应用程序中实现动态连接到多个数据库的功能,适应不同的应用场景。在实际的企业级应用中,这个功能可以和负载均衡、故障转移等技术结合,提高应用性能和可用性。

我的笔记