SQLAlchemy配置连接多个数据库

 1.定义配置项


首先定义两个数据库的配置信息

# PostgreSQL database configuration
DB_USERNAME=postgres
DB_PASSWORD=passord
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=test# mysql database configuration
DB_USERNAME_MYSQL=root
DB_PASSWORD_MYSQL=password
DB_HOST_MYSQL=127.0.0.1
DB_PORT_MYSQL=3306
DB_DATABASE_MYSQL=test

2.定义Config类

首先读取上面的数据库配置项。

“db_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很像

pip install PyMySQL

Config代码内容:

class Config:"""Application configuration class."""def __init__(self):# ------------------------# Database Configurations.# ------------------------db_credentials = {key: get_env(key) for key in['DB_USERNAME', 'DB_PASSWORD', 'DB_HOST', 'DB_PORT', 'DB_DATABASE', 'DB_CHARSET']}self.SQLALCHEMY_DATABASE_URI_SCHEME = get_env('SQLALCHEMY_DATABASE_URI_SCHEME')db_extras = f"?client_encoding={db_credentials['DB_CHARSET']}" if db_credentials['DB_CHARSET'] else ""self.SQLALCHEMY_DATABASE_URI = f"{self.SQLALCHEMY_DATABASE_URI_SCHEME}://{db_credentials['DB_USERNAME']}:{db_credentials['DB_PASSWORD']}@{db_credentials['DB_HOST']}:{db_credentials['DB_PORT']}/{db_credentials['DB_DATABASE']}{db_extras}"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']}# password = db_mysql_credentials['DB_PASSWORD_MYSQL']# pwd = parse.quote_plus(password)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': int(get_env('SQLALCHEMY_POOL_SIZE')),'max_overflow': int(get_env('SQLALCHEMY_MAX_OVERFLOW')),'pool_recycle': int(get_env('SQLALCHEMY_POOL_RECYCLE')),'pool_pre_ping': get_bool_env('SQLALCHEMY_POOL_PRE_PING'),'connect_args': {'options': '-c timezone=UTC'},}self.SQLALCHEMY_ECHO = get_bool_env('SQLALCHEMY_ECHO')

3.初始化SQLAlchemy

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

from flask_sqlalchemy import SQLAlchemy
from myconfig import Config
from flask import Flask
import flask_migrateapp = 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 SQLAlchemydb = 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 SQLAlchemydb = 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="")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/40132.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后端之路——阿里云OSS云存储

一、何为阿里云OSS 全名叫“阿里云对象存储OSS”,就是云存储,前端发文件到服务器,服务器不用再存到本地磁盘,可以直接传给“阿里云OSS”,存在网上。 二、怎么用 大体逻辑: 细分的话就是: 1、准…

Rust: Fury高性能序列化库尝试

在序列化库中,传统的有Json,XML,性能好的有thrift,protobuf等。据说Fury官网的介绍,Fury性能要远远好于protobuf,且不象protobuf还需要定义IDL,非常轻便,随取随用。 今天来尝试一下。 一、carg…

gitlab每日备份以及restore

gitlab服务有非常简洁的每日备份命令, 从production的gitlab的每日备份中restore到backup环境也非常方便。 一、Production gitlab每日备份 1. Production gitlab环境上编写脚本 cat /root/gitlab_bak.shgitlab-rake gitlab:backup:create > /var/opt/gitl…

JavaSE (Java基础):面向对象(下)

8.7 多态 什么是多态? 即同一方法可以根据发送对象的不同而采用多种不同的方式。 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。在句话我是这样理解的: 在实例中使用方法都是根据他最开始将类实例化最左边的类型来定的&…

消息中间件ApacheKafka在windows简单安装

一.背景 之前公司需要API网关管理软件ApacheShenYu,我相信把调用的记录都存到一个数据库。他支持日志推送到kafka,所以,我准备尝试一下通过kafka接收调用的日志信息。第一步,当然是安装kafka了。 二.ApacheKafka的下载 打开下载…

【C++】 解决 C++ 语言报错:Memory Leak

文章目录 引言 内存泄漏(Memory Leak)是 C 编程中常见且严重的内存管理问题之一。当程序分配了内存而没有正确释放,导致内存无法被重新利用时,就会发生内存泄漏。这种错误会导致程序占用越来越多的内存,最终可能导致系…

关于人情世故的小讨论

大家好,我是阿赵。   最近国内篮球界内出了不少事情,让人对篮球这项运动产生了很多疑问。   去年的CUBA,拥有全国最好生源的清华大学居然输给了连985 、211都不是的广东工业大学。作为广工的毕业生,我知道广工的篮球一直都很强…

Unity PC和Android端的数据存储和读取

使用Resource&#xff1a; 提示&#xff1a;使用resouce打包后会被压缩进.resources文件中&#xff0c;意味着它是只读文件&#xff0c;且必须使用resouce.load加载&#xff1a; /// <summary>/// 全平台使用/// </summary>/// <typeparam name"T"&g…

论文学习——动态多目标优化的一种新的分位数引导的对偶预测策略

论文题目&#xff1a;A novel quantile-guided dual prediction strategies for dynamic multi-objective optimization 动态多目标优化的一种新的分位数引导的对偶预测策略&#xff08;Hao Sun a,b, Anran Cao a,b, Ziyu Hu a,b, Xiaxia Li a,b, Zhiwei Zhao c&#xff09;In…

“免费”的可视化大屏案例分享-智慧园区综合管理平台

一.智慧园区是什么&#xff1f; 智慧园区是一种融合了新一代信息与通信技术的先进园区发展理念。它通过迅捷信息采集、高速信息传输、高度集中计算、智能事务处理和无所不在的服务提供能力&#xff0c;实现了园区内及时、互动、整合的信息感知、传递和处理。这样的园区旨在提高…

自定义注解-手机号验证注解

注解 package com.XX.assess.annotation;import com.XX.assess.util.MobileValidator;import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*;/*** 手机号校验注解* @author super*/ @Retention(RetentionPolicy.RUNTIME) @Ta…

正确使用Pytorch Geometric打开Cora(Planetoid)数据集

文章目录 关于报错&#xff08;"Cannot connect to host"&#xff09;解决方法 关于报错&#xff08;“Cannot connect to host”&#xff09; 我们在使用PyG调用Planetoid数据集的时候&#xff0c;常会碰到如下报错&#xff1a; 解决方法就是手动下载这个数据集。…

在 AWS Lambda 中使用 Flask 应用

本文将介绍如何在 AWS Lambda 中创建和部署一个使用 Flask 框架的应用。 1. 创建 Lambda 函数 首先,在 AWS Lambda 控制台创建一个新的函数,命名为 ​​flask-app​​。 2. 准备 Flask 层 为了在 Lambda 中使用 Flask,我们需要创建一个包含 Flask 库的层。按照以下步骤操…

java中如何使用ffmpeg命令来实现视频编码转换

在Java中使用FFmpeg命令来进行视频编码转换&#xff0c;可以通过调用系统命令来执行FFmpeg命令。下面是一个使用FFmpeg进行视频转码的示例代码&#xff1a; import java.io.BufferedReader; import java.io.InputStreamReader;public class FFmpegVideoConverter {public stat…

前端播放RTSP视频流,使用FLV请求RTSP视频流播放(Vue项目,在Vue中使用插件flv.js请求RTSP视频流播放)

简述&#xff1a;在浏览器中请求 RTSP 视频流并进行播放时&#xff0c;直接使用原生的浏览器 API 是行不通的&#xff0c;因为它们不支持 RTSP 协议。为了解决这个问题&#xff0c;开发者通常会选择使用像 flv.js 这样的库&#xff0c;它专为在浏览器中播放 FLV 和其他流媒体格…

MySQL 代理层:ProxySQL

文章目录 说明安装部署1.1 yum 安装1.2 启停管理1.3 查询版本1.4 Admin 管理接口 入门体验功能介绍3.1 多层次配置系统 读写分离将实例接入到代理服务定义主机组之间的复制关系配置路由规则事务读的配置延迟阈值和请求转发 ProxySQL 核心表mysql_usersmysql_serversmysql_repli…

Java实现日志全链路追踪.精确到一次请求的全部流程

广大程序员在排除线上问题时,会经常遇见各种BUG.处理这些BUG的时候日志就格外的重要.只有完善的日志才能快速有效的定位问题.为了提高BUG处理效率.我决定在日志上面优化.实现每次请求有统一的id.通过id能获取当前接口的全链路流程走向. 实现效果如下: 一次查询即可找到所有关…

自定义一个背景图片的高度,随着容器高度的变化而变化,小于图片的高度时裁剪,大于时拉伸100%展示

1、通过js创建<image?>标签来获取背景图片的宽高比&#xff1b; 2、当元素的高度大于原有比例计算出来的高度时&#xff0c;背景图片的高度拉伸自适应100%&#xff0c;否则高度为auto&#xff0c;会自动被裁减 3、背景图片容器高度变化时&#xff0c;自动计算背景图片的…

Android network - NUD检测机制(Android 14)

Android network - NUD检测机制 1. 前言2. 源码分析2.1 ClientModeImpl2.2 IpClient2.3 IpReachabilityMonitor 1. 前言 在Android系统中&#xff0c;NUD&#xff08;Neighbor Unreachable Detection&#xff09;指的是网络中的邻居不可达检测机制&#xff0c;它用于检测设备是…

数据驱动测试实践:Postman 中使用数据文件的指南

Postman 是一个强大的 API 开发和测试工具&#xff0c;它支持数据驱动测试&#xff0c;允许测试者使用外部数据文件来驱动测试&#xff0c;实现测试用例的参数化。数据驱动测试可以显著提高测试效率&#xff0c;减少重复工作&#xff0c;并允许测试用例覆盖更广泛的输入场景。本…