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="")
相关文章:
SQLAlchemy配置连接多个数据库
1.定义配置项 首先定义两个数据库的配置信息 # PostgreSQL database configuration DB_USERNAMEpostgres DB_PASSWORDpassord DB_HOST127.0.0.1 DB_PORT5432 DB_DATABASEtest# mysql database configuration DB_USERNAME_MYSQLroot DB_PASSWORD_MYSQLpassword DB_HOST_MYSQL127…...
NLP+LLM从入门到精通系列
NLPLLM从入门到精通系列 前言:笔者从事于NLPLLM的对话智能机器人的相关行业,现在的大模型的技术日新月异,传统的NLP业务显然是要被淘汰的,那么这也是我着笔写这一系列文章的初衷。本系列将由浅到深,结合实际代码案例&…...
用数组手搓一个小顶堆
堆默认从数组下标为1开始存储。 const int N201000; int heap[N]; int len; 插入操作: 将元素插入到堆的末尾位置向上调整。 void up(int k){while(k>1&&heap[k/2]>heap[k]){swap(heap[k],heap[k/2]);k/2;} } //len为当前存在元素长度 void Inser…...
【Linux开发】基于ALSA库实现音量调节
基于ALSA库实现音量调节 ALSA库实现音量调节1、使用alsamixer工具查看音频接口2、完整代码2.1、snd_mixer_open2.2、snd_mixer_attach、2.3、snd_mixer_selem_register2.4、snd_mixer_load2.5、snd_mixer_first_elem/snd_mixer_elem_next2.6、snd_mixer_selem_get_playback_vol…...
代理IP在未来将面临哪些挑战?
今天我们来聊聊代理IP在未来可能会面临的挑战。虽然代理IP技术目前应用广泛,但随着科技的发展和网络环境的变化,代理IP也将面临一些新的挑战。让我们一起来看看这些挑战是什么吧! 1. 更严格的网络封锁和检测 现代社会各行各业都在飞速发展&…...
FineBI在线学习资源-数据处理
FineBI在线学习资源汇总: 学习资源 视频课程 帮助文档 问答 数据处理学习文档: 相关资料: 故事背景概述-https://help.fanruan.com/finebi6.0/doc-view-1789.html 基础表处理-https://help.fanruan.com/finebi6.0/doc-view-1791.html …...
【代码随想录算法训练营第37期 第四十五天 | LeetCode198.打家劫舍、213.打家劫舍II、337.打家劫舍III】
代码随想录算法训练营第37期 第四十五天 | LeetCode198.打家劫舍、213.打家劫舍II、337.打家劫舍III 一、198.打家劫舍 解题代码C: class Solution { public:int rob(vector<int>& nums) {if (nums.size() 0) return 0;if (nums.size() 1) return num…...
Elasticsearch查询上下文和_source
查询上下文 {"took": 1,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation"…...
golang实现网卡流量监控
获取当前时刻一分钟前的网卡流量排序 package mainimport ("fmt""github.com/mackerelio/go-osstat/network""log""net/http""sort""strconv""time" )var arr []map[string]int var arr2 []map[string]…...
技术分享:直播平台如何开发并接入美颜SDK
本篇文章,笔者将分享直播平台如何开发并接入美颜SDK的技术细节与步骤。 一、选择合适的美颜SDK 首先,选择一款适合的美颜SDK非常重要。市面上有很多优秀的美颜SDK供应商,选择时应考虑以下因素: 功能丰富性:支持美白…...
左耳听风_114_113_Go编程模式修饰器
你好,我是陈浩,我名多尔多house.之前呢我写过一篇文章叫做python修饰器的函数式编程。 那这种模式呢可以很轻松的把一些函数啊装配到另外一些函数上。 让你的代码呢更加简单,也可以让一些小功能性的代码复用性更高。 让代码中的函数呢可以…...
Java实习手册(小白也看得懂)
秃狼说 距离俺发布的学习路线已经六个月了,那我给小伙伴的学习周期是四五个月左右,我相信大多的小伙伴已经学习的差不多了。正好赶上暑期实习的阶段,在暑期找到实习就成为暑期的头等大事。 实习经验在校招的起到决定性的作用,所…...
Elasticsearch 分析器(Analyzer)的作用和配置
在Elasticsearch中,分析器(Analyzer)是文本处理的核心组件,它负责将输入的文本转换为可用于搜索和索引的词项(tokens)。这一过程涉及多个步骤,包括字符过滤、分词和标记过滤,共同决定…...
SpringBoot(一)创建一个简单的SpringBoot工程
Spring框架常用注解简单介绍 SpringMVC常用注解简单介绍 SpringBoot(一)创建一个简单的SpringBoot工程 SpringBoot(二)SpringBoot多环境配置 SpringBoot(三)SpringBoot整合MyBatis SpringBoot(四…...
简述Vue中的数据双向绑定原理
Vue中的数据双向绑定原理是Vue框架的核心特性之一,它通过数据劫持结合发布者-订阅者模式来实现。下面将详细阐述Vue中数据双向绑定的原理,并尽量按照清晰的结构进行归纳: 一、数据劫持 使用Object.defineProperty(): Vue在组件…...
C++STL函数对象的应用
STL函数对象 文章目录 STL函数对象1.基本概念2.使用方法1. 简单函数对象示例2. 函数对象作为算法参数3. Lambda表达式作为函数对象 2.一元谓词和二元谓词1.一元谓词2.二元谓词3.总结 3.算术仿函数1.使用示例2.Lambda表达式的替代 4.关系仿函数5.逻辑仿函数 C中的函数对象&#…...
AJAX-day1:
注:文件布局: 一、AJAX的概念: AJAX是浏览器与服务器进行数据通信的技术 >把数据变活 二、AJAX的使用: 使用axios库,与服务器进行数据通信 基于XMLHttpRequest封装,代码简单 Vue,React项目使用 学习…...
昆虫学(书籍学习资料)
包括昆虫分类(上下册)、昆虫生态大图鉴等书籍资料。...
springboot + mybatis 多数据源切换
参考的b站博主写的 配置文件: spring:datasource:db1:jdbc-url: jdbc:mysql://localhost:3306/interview_database?useUnicodetrue&characterEncodingutf-8&useSSLfalseusername: rootpassword: 12345driver-class-name: com.mysql.cj.jdbc.Driverdb2:jdbc-url: jdbc…...
windows电脑网络重置后wifi列表消失怎么办?
我们的电脑网络偶尔会出现异常,我们通常会下意识选择网络诊断,运行完诊断后一般会让我们选择重置网络,然而,重置后wifi列表突然消失,无法愉快地上网了,找了一圈,都说是更改适配器选项࿰…...
5分钟快速上手:AnythingtoRealCharacters2511动漫图片转真人照片教程
5分钟快速上手:AnythingtoRealCharacters2511动漫图片转真人照片教程 1. 认识你的动漫转真人工具 1.1 工具能做什么? AnythingtoRealCharacters2511是一个专门将动漫图片转化为真人照片的AI工具。它基于Qwen-Image-Edit模型开发,特别擅长处…...
Kimi-VL-A3B-Thinking作品分享:OCR识别模糊手写体+公式识别+LaTeX自动转换
Kimi-VL-A3B-Thinking作品分享:OCR识别模糊手写体公式识别LaTeX自动转换 1. 引言:当AI能看懂你的草稿纸 想象一下,你有一张拍得有点模糊的会议白板照片,上面潦草地写满了讨论要点和几个复杂的数学公式。或者,你翻出一…...
BGE-M3快速入门:多语言文本相似度分析从零到一
BGE-M3快速入门:多语言文本相似度分析从零到一 1. 引言:从“关键词匹配”到“语义理解” 你有没有遇到过这样的场景?在搜索引擎里输入“苹果”,结果既出现了水果,也出现了手机公司。或者,你想找“如何学习…...
Qwen3-0.6B-FP8极速对话工具:STM32F103C8T6最小系统板集成
Qwen3-0.6B-FP8极速对话工具:STM32F103C8T6最小系统板集成 让AI对话能力跑在指甲盖大小的开发板上 1. 场景与痛点 你可能很难想象,一个能进行智能对话的AI模型,居然可以运行在一块只有拇指大小的STM32开发板上。传统的AI模型部署往往需要强大…...
OpenClaw本地模型成本对比:nanobot镜像vs商业API实测
OpenClaw本地模型成本对比:nanobot镜像vs商业API实测 1. 为什么需要关注OpenClaw的模型成本 上周我在尝试用OpenClaw自动化处理200份PDF文档时,意外发现账单上出现了三位数的API费用。这个数字让我意识到——当OpenClaw需要频繁调用大模型进行决策时&a…...
自媒体人的秘密武器:OpenClaw+nanobot自动生成视频字幕文件
自媒体人的秘密武器:OpenClawnanobot自动生成视频字幕文件 1. 为什么我们需要自动化字幕生成 作为一个长期在视频创作领域摸索的自媒体人,我深知字幕制作这个环节有多折磨人。曾经为了给一段10分钟的视频添加字幕,我需要反复暂停播放、手动…...
嵌入式系统开发中的关键技术术语解析
嵌入式系统开发中的56个关键技术术语解析1. 数据转换基础概念1.1 采样与保持特性采集时间(Tacq)是从释放保持状态到采样电容电压稳定至新输入值的1 LSB范围之内所需的时间。在采样-保持电路中,这个参数直接影响系统的动态性能。孔径延迟(tAD)描述从时钟信号的采样沿…...
leOS2:基于看门狗定时器的轻量级嵌入式调度器
1. leOS2:基于看门狗定时器的轻量级嵌入式调度器 leOS2(little embedded Operating System 2)是一个专为资源受限的8位AVR微控制器设计的极简实时调度器。它不依赖于通用定时器(如Timer0/Timer1),而是创造…...
CSSCI论文写作03:确定论文的选题
什么是选题 选题:选择一个适合的研究指向!!! 选择: 而不是创造,创新是内在要求 你要坚信:所有的选题都有前人关注过研究过,我们不求“栽树”,只求“乘凉”,填补什么空白,只能说明自己的浅薄无知。 适合: 个人经验的学术表达,找到那双穿在自己脚上的鞋子没有不能…...
M5Stack U126 RTC驱动库:PCF8563T嵌入式实时时钟深度解析
1. 项目概述M5Unit-RTC 是专为 M5Stack 生态中 Unit 系列模块设计的轻量级实时时钟(RTC)驱动库,对应硬件型号为U126—— 一款基于Ricoh RP5C01A 兼容架构、实际采用 NXP PCF8563T 实时时钟芯片的 IC 接口 RTC 模块。该模块集成高精度温度补偿…...
