django 链接多个数据库 并使用原生sql实现


Posted in Python onMarch 28, 2020

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])
    cursor.execute("SELECT foo FROM bar 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实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python函数参数类型*、**的区别
Apr 11 Python
Python 探针的实现原理
Apr 23 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
Apr 02 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
Jun 20 Python
解决Django layui {{}}冲突的问题
Aug 29 Python
python cv2读取rtsp实时码流按时生成连续视频文件方式
Dec 25 Python
Python进程的通信Queue、Pipe实例分析
Mar 30 Python
Keras自定义IOU方式
Jun 10 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
Jun 16 Python
在tensorflow以及keras安装目录查询操作(windows下)
Jun 19 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
Dec 31 Python
浅谈盘点5种基于Python生成的个性化语音方法
Feb 05 Python
Django多数据库配置及逆向生成model教程
Mar 28 #Python
后端开发使用pycharm的技巧(推荐)
Mar 27 #Python
如何基于python3和Vue实现AES数据加密
Mar 27 #Python
python小程序基于Jupyter实现天气查询的方法
Mar 27 #Python
Python实现的北京积分落户数据分析示例
Mar 27 #Python
Pyspark获取并处理RDD数据代码实例
Mar 27 #Python
Python Django中的STATIC_URL 设置和使用方式
Mar 27 #Python
You might like
PHP设计模式 注册表模式(多个类的注册)
2012/02/05 PHP
如何把php5.3版本升级到php5.4或者php5.5
2015/07/31 PHP
[原创]php简单隔行变色功能实现代码
2016/07/09 PHP
jQuery 剧场版 你必须知道的javascript
2009/05/27 Javascript
DIV菜单层实现代码
2010/11/19 Javascript
火狐4、谷歌12不支持Jquery Validator的解决方法分享
2011/06/20 Javascript
JavaScript基础篇(3)之Object、Function等引用类型
2015/11/30 Javascript
学习javascript面向对象 理解javascript原型和原型链
2016/01/04 Javascript
Bootstrap使用基础教程详解
2016/09/05 Javascript
JS填写银行卡号每隔4位数字加一个空格
2016/12/19 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
2017/11/23 Javascript
bootstrap datetimepicker控件位置异常的解决方法
2017/11/23 Javascript
3种vue组件的书写形式
2017/11/29 Javascript
原生JS实现循环Nodelist Dom列表的4种方式示例
2018/02/11 Javascript
微信小程序上传多图到服务器并获取返回的路径
2019/05/05 Javascript
vue 实现强制类型转换 数字类型转为字符串
2019/11/07 Javascript
vue+elementUI 实现内容区域高度自适应的示例
2020/09/26 Javascript
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
python查找第k小元素代码分享
2013/12/18 Python
Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
2014/06/04 Python
python实现支持目录FTP上传下载文件的方法
2015/06/03 Python
Python简单计算文件夹大小的方法
2015/07/14 Python
Python之NumPy(axis=0 与axis=1)区分详解
2019/05/27 Python
Python猴子补丁知识点总结
2020/01/05 Python
通过Turtle库在Python中绘制一个鼠年福鼠
2020/02/03 Python
使用 pytorch 创建神经网络拟合sin函数的实现
2020/02/24 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
django 将自带的数据库sqlite3改成mysql实例
2020/07/09 Python
记一次高分屏下canvas模糊问题
2020/02/17 HTML / CSS
荷兰鞋子在线:Nelson Schoenen
2017/12/25 全球购物
Bluebella美国官网:英国性感内衣品牌
2018/10/04 全球购物
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
什么是类的返射机制
2016/02/06 面试题
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
2015/02/22 面试题
先进工作者申报材料
2014/12/23 职场文书
2019年作为一名实习生的述职报告
2019/09/29 职场文书