1. 程式人生 > 程式設計 >django 連結多個數據庫 並使用原生sql實現

django 連結多個數據庫 並使用原生sql實現

settings檔案如下:

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.sqlite3','NAME': os.path.join(BASE_DIR,'db.sqlite3'),},'db1': {  # 配置第二個資料庫節點名稱
    '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

上述方法是設定中如果有多個數據庫,會預設使用 default,當你想使用指定的資料庫連線時,引入的物件就變成了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])
    row = cursor.fetchone()
 
  return row

之後再進行操作。

補充知識:Django多資料來源接入類

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的內容

(

import cx_Oracle
import pymysql

# 定義一個數據庫型別&引擎的字典,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進行對應的資料庫連結
    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規則
    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)
      # 連結成功後建立一個遊標
      cs_ms = conn.cursor()
    except Exception as e:
      raise e
    else:
      # 明顯的開啟事務
      with transaction.atomic():
        # 在安全的地方,建立儲存點,將來操作資料庫失敗回滾到此
        save_id = transaction.savepoint()

        try:

          # 獲取一個元組
          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 連結多個數據庫 並使用原生sql實現就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。