Python使用SQLAlchemy连接多个数据库

1.定义配置项

首先定义两个数据库的配置信息,如果有更多的就参照写就行。

DB_USERNAME_PG: postgres
DB_PASSWORD_PG: test123456
DB_HOST_PG: 127.0.0.1
DB_PORT_PG: 5432
DB_DATABASE_PG: test

DB_USERNAME_MYSQL: root
DB_PASSWORD_MYSQL: root123456
DB_HOST_MYSQL: 127.0.0.1
DB_PORT_MYSQL: 3306
DB_DATABASE_MYSQL: newdb

2.定义Config类

我只写了关键部分,其他sqlalchemy的配置项可以参考官网文档自己写。

首先按照自己喜欢的方式读取上面你写的数据库配置项。“db_postgres_credentials”和“db_mysql_credentials”是我储存对应数据库配置的自定义字段,随意起名即可。

“self.SQLALCHEMY_DATABASE_URI”字段名代表sqlalchemy的主数据库,这里我使用的是postgres,里面按照文档要求填上对应的请求地址。

“self.SQLALCHEMY_BINDS”可以理解为副数据库,可以把其他数据库都写在这里,其值是dict格式。格式为{"key":"databaseUri"}。每个数据库都必须以唯一的键值区分,键值按自己喜好取就行。mysql1,mysql2,mysql3什么的....

"self.SQLALCHEMY_ENGINE_OPTIONS"代表连接池大小

“self.SQLALCHEMY_ECHO”代表sqlalchemy在每次请求时是否在控制台打印sql语句

注意:

SQLAlchemy采用的是加载对应数据库DBAPI 的方式来连接的,而具体加载哪个DBAPI 是你在数据库URI中声明的,如“mysql+pymysql”代表使用PyMySQL连接mysql,也就是说你需要先安装PyMySQL库。这其实和使用java时用JDBC映射的方式连接mysql很像,SQLAlchemy还支持其他库,具体可以看这个链接,连接其他数据库的方式也可以在文档内翻到,很方便。  >>>>> MySQL and MariaDB <<<<< 

pip install PyMySQL

Config代码内容:

class Config:

    def __init__(self):
        # 数据库配置
        db_postgres_credentials = {
            key: get_env(key) for key in
            ['DB_USERNAME_PG', 'DB_PASSWORD_PG', 'DB_HOST_PG', 'DB_PORT_PG', 'DB_DATABASE_PG']
        }
        db_mysql_credentials = {
            key: get_env(key) for key in
            ['DB_USERNAME_MYSQL', 'DB_PASSWORD_MYSQL', 'DB_HOST_MYSQL', 'DB_PORT_MYSQL', 'DB_DATABASE_MYSQL']
        }
        
        #连接地址配置
        self.SQLALCHEMY_DATABASE_URI = f"postgresql://{db_postgres_credentials['DB_USERNAME_PG']}:{db_postgres_credentials['DB_PASSWORD_PG']}@{db_postgres_credentials['DB_HOST_PG']}:{db_postgres_credentials['DB_PORT_PG']}/{db_postgres_credentials['DB_DATABASE_PG']}"
        self.SQLALCHEMY_BINDS = {
            "mysqlkey":f"mysql+pymysql://{db_mysql_credentials['DB_USERNAME_MYSQL']}:{db_mysql_credentials['DB_PASSWORD_MYSQL']}@{db_mysql_credentials['DB_HOST_MYSQL']}:{db_mysql_credentials['DB_PORT_MYSQL']}/{db_mysql_credentials['DB_DATABASE_MYSQL']}?charset=utf8mb4"
        }

        #连接池大小
        self.SQLALCHEMY_ENGINE_OPTIONS = {'pool_size': 30}

        #是否需要在每次请求数据库时打印对应的sql语句
        self.SQLALCHEMY_ECHO = False

3.初始化SQLAlchemy

编写好Config类后,就可以初始化sqlalchemy了。

from flask_sqlalchemy import SQLAlchemy
from myconfig import Config
from flask import Flask
import flask_migrate


app = Flask()

app.config.from_object(Config())

db = SQLAlchemy()

db.init_app(app)

flask_migrate.Migrate(app, db)

4.定义不同数据库的表结构

如果表所对应的数据库是通过“self.SQLALCHEMY_DATABASE_URI”字段绑定到SQLAlchemy上的,那么它所对应的类不需要做额外的修改,SQLAlchemy默认使用主数据库。

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Setup(db.Model):
    __tablename__ = 'setups'
    __table_args__ = (
        db.PrimaryKeyConstraint('version', name='setup_pkey'),
    )

    version = db.Column(db.String(255), nullable=False)
    setup_at = db.Column(db.DateTime, nullable=False, server_default=db.text('CURRENT_TIMESTAMP(0)'))

如果表所对应的数据库是通过“self.SQLALCHEMY_BINDS”字段的方式绑定到SQLAlchemy上的,那么就需要在类的开头用__bind_key__声明这张表是在哪一个数据库上,值填写你在“self.SQLALCHEMY_BINDS”的dict上对应数据库的key,我的是“mysqlkey”,其他照旧。

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class MysqlTestTable(db.Model):
    __bind_key__ = "mysqlkey"
    __tablename__ = "test_table"
    __table_args__ = (
        db.PrimaryKeyConstraint("id", name="PRIMARY"),
        db.Index("idx_unique", "phoneNo"),
    )
    id = db.Column(db.BigInteger, primary_key=True, autoincrement=True)
    phoneNo = db.Column(db.BigInteger, nullable=False, comment="")
    name = db.Column(db.String(20), nullable=False, comment="")

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用SQLAlchemy连接多个数据库使用连接池,你可以创建多个连接池对象并为每个数据库创建一个独立的引擎。以下是一个示例代码,展示了如何使用SQLAlchemy连接连接多个MySQL数据库: ```python from sqlalchemy import create_engine from sqlalchemy.pool import QueuePool # 创建连接池1 pool1 = QueuePool( creator=lambda: mysql.connector.connect( host='localhost', database='database1', user='username1', password='password1' ), pool_size=5 ) # 创建连接池2 pool2 = QueuePool( creator=lambda: mysql.connector.connect( host='localhost', database='database2', user='username2', password='password2' ), pool_size=5 ) # 创建SQLAlchemy引擎1 engine1 = create_engine('mysql+mysqlconnector://', creator=pool1.get) # 创建SQLAlchemy引擎2 engine2 = create_engine('mysql+mysqlconnector://', creator=pool2.get) # 将DataFrame写入数据库1的表 df.to_sql(name='table1', con=engine1, if_exists='replace', index=False) # 将DataFrame写入数据库2的表 df.to_sql(name='table2', con=engine2, if_exists='replace', index=False) ``` 在上面的代码中,你需要将`database1`、`username1`、`password1`替换为第一个数据库的实际信息,将`database2`、`username2`、`password2`替换为第二个数据库的实际信息。 通过创建多个连接池对象和引擎对象,你可以连接多个MySQL数据库,并使用连接池管理数据库连接。 希望这可以满足你的需求!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值