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.pswp.cn/web/40132.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40132.shtml
英文地址,請注明出處:http://en.pswp.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;并允許測試用例覆蓋更廣泛的輸入場景。本…