django 鏈接多個(gè)數(shù)據(jù)庫 并使用原生sql實(shí)現(xiàn)
settings文件如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
'db1': { # 配置第二個(gè)數(shù)據(jù)庫節(jié)點(diǎn)名稱
'ENGINE': 'django.db.backends.oracle',
'NAME': 'devdb',
'USER': 'hysh',
'PASSWORD': 'hysh',
'HOST': '192.168.191.3',
'PORT': '1521',
},
}
查找Django的文檔:
from django.db import connection
def my_custom_sql(self):
with connection.cursor() as cursor:
cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
row = cursor.fetchone()
return row
上述方法是設(shè)置中如果有多個(gè)數(shù)據(jù)庫,會默認(rèn)使用 default,當(dāng)你想使用指定的數(shù)據(jù)庫連接時(shí),引入的對象就變成了connections !
from django.db import connection
def my_custom_sql(self):
with connection.cursor() as cursor:
cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
row = cursor.fetchone()
return row
之后再進(jìn)行操作。
補(bǔ)充知識:Django多數(shù)據(jù)源接入類
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from rest_framework import status
from django.db import transaction
from .contants import db_dict
contants.py的內(nèi)容
(
import cx_Oracle
import pymysql
# 定義一個(gè)數(shù)據(jù)庫類型&引擎的字典,
db_dict = {'mysql':pymysql,'Oracle':cx_Oracle}
)
from .models import DataSystem,Rule
class DBconnectView(GenericAPIView):
__DBtype = db_dict
def get(self,request,pk,rule_id):
# 通過傳入的id進(jìn)行對應(yīng)的數(shù)據(jù)庫鏈接
self.datas = DataSystem.objects.get(pk=pk)
self.url = self.datas.url
self.username = self.datas.username
self.password = self.datas.password_enc
self.DBname = self.datas.name
self.DBtype = self.__DBtype[self.datas.type]
# 獲取check_code規(guī)則
self.ruledatas = Rule.objects.get(id=rule_id)
self.check_code = self.ruledatas.check_code
# db = __import__(self.DBtype)
try:
conn = self.DBtype.connect(host=self.url,user=self.username,password=self.password,database=self.DBname)
# 鏈接成功后創(chuàng)建一個(gè)游標(biāo)
cs_ms = conn.cursor()
except Exception as e:
raise e
else:
# 明顯的開啟事務(wù)
with transaction.atomic():
# 在安全的地方,創(chuàng)建保存點(diǎn),將來操作數(shù)據(jù)庫失敗回滾到此
save_id = transaction.savepoint()
try:
# 獲取一個(gè)元組
db_ret = cs_ms.execute(self.check_code)
except Exception as e:
transaction.savepoint_rollback(save_id)
raise e
else:
db_set = db_ret.fetchone()
# transaction.savepoint_commit(save_id)
finally:
cs_ms.close()
conn.close()
return Response({'pk':pk,'rule_id':rule_id})
以上這篇django 鏈接多個(gè)數(shù)據(jù)庫 并使用原生sql實(shí)現(xiàn)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 詳解多線程Django程序耗盡數(shù)據(jù)庫連接的問題
- Django使用多數(shù)據(jù)庫的方法
- Django中數(shù)據(jù)庫的數(shù)據(jù)關(guān)系:一對一,一對多,多對多
- django 多數(shù)據(jù)庫配置教程
- Django app配置多個(gè)數(shù)據(jù)庫代碼實(shí)例
- Django多數(shù)據(jù)庫配置及逆向生成model教程
- django 多數(shù)據(jù)庫及分庫實(shí)現(xiàn)方式
- Django多數(shù)據(jù)庫的實(shí)現(xiàn)過程詳解
- Django多數(shù)據(jù)庫聯(lián)用實(shí)現(xiàn)方法解析
- django使用多個(gè)數(shù)據(jù)庫的方法實(shí)例
相關(guān)文章
selenium設(shè)置瀏覽器為headless無頭模式(Chrome和Firefox)
這篇文章主要介紹了selenium設(shè)置瀏覽器為headless無頭模式(Chrome和Firefox),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
selenium?drag_and_drop不生效的解決辦法
本文主要介紹了selenium?drag_and_drop不生效的解決辦法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
在django項(xiàng)目中導(dǎo)出數(shù)據(jù)到excel文件并實(shí)現(xiàn)下載的功能
這篇文章主要介紹了在django項(xiàng)目中導(dǎo)出數(shù)據(jù)到excel文件并實(shí)現(xiàn)下載的功能,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
python實(shí)現(xiàn)360皮膚按鈕控件示例
這篇文章主要介紹了python實(shí)現(xiàn)360皮膚按鈕控件示例,需要的朋友可以參考下2014-02-02
Python發(fā)送郵件實(shí)現(xiàn)基礎(chǔ)解析
這篇文章主要介紹了Python發(fā)送郵件實(shí)現(xiàn)基礎(chǔ)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Django imgareaselect手動(dòng)剪切頭像實(shí)現(xiàn)方法
這篇文章主要介紹了Django imgareaselect手動(dòng)剪切頭像實(shí)現(xiàn)方法,實(shí)例分析了Django框架操作圖片的相關(guān)技巧,需要的朋友可以參考下2015-05-05

