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基础教程之类class定义使用方法
Feb 20 Python
Python实现压缩与解压gzip大文件的方法
Sep 18 Python
Python简单计算给定某一年的某一天是星期几示例
Jun 27 Python
python实现统计文本中单词出现的频率详解
May 20 Python
pandas DataFrame 交集并集补集的实现
Jun 24 Python
使用python 写一个静态服务(实战)
Jun 28 Python
PyTorch之图像和Tensor填充的实例
Aug 18 Python
Python 实现使用空值进行赋值 None
Mar 12 Python
Django REST framwork的权限验证实例
Apr 02 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
May 03 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
Jun 06 Python
套娃式文件夹如何通过Python批量处理
Aug 23 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
wordpress自定义url参数实现路由功能的代码示例
2013/11/28 PHP
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
2014/03/17 PHP
JS关闭窗口或JS关闭页面的几种代码分享
2013/10/25 Javascript
JS实现日期加减的方法
2013/11/29 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐)
2016/06/23 Javascript
jQuery实现自动调用和触发某个事件的方法
2016/11/18 Javascript
Angularjs实现分页和分页算法的示例代码
2016/12/23 Javascript
angular+ionic 的app上拉加载更新数据实现方法
2017/01/16 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
2019/02/15 Javascript
原生JS实现逼真的图片3D旋转效果详解
2019/02/16 Javascript
详解nvm管理多版本node踩坑
2019/07/26 Javascript
微信小程序中为什么使用var that=this
2019/08/27 Javascript
Vue混入mixins滚动触底的方法
2019/11/22 Javascript
让Vue响应Map或Set的变化操作
2020/11/11 Javascript
[14:00]DOTA2国际邀请赛史上最长大战 赛后专访B神
2013/08/10 DOTA
[01:16]2014DOTA2 TI专访C9战队EE:中国五强中会占三席
2014/07/10 DOTA
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
Python Web服务器Tornado使用小结
2014/05/06 Python
跟老齐学Python之字典,你还记得吗?
2014/09/20 Python
python字符串str和字节数组相互转化方法
2017/03/18 Python
python+requests+unittest API接口测试实例(详解)
2017/06/10 Python
python如何为创建大量实例节省内存
2018/03/20 Python
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
Python datetime模块使用方法小结
2020/06/18 Python
css3 按钮样式简单可扩展创建
2013/03/18 HTML / CSS
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
优乐美广告词
2014/03/14 职场文书
综合实践活动总结
2014/05/05 职场文书
中学教师师德承诺书
2014/05/23 职场文书
药品营销策划方案
2014/06/15 职场文书
初中同学会活动方案
2014/08/22 职场文书
2014年节能降耗工作总结
2014/12/11 职场文书
简历自我评价优缺点
2015/03/11 职场文书
如何用Node.js编写内存效率高的应用程序
2021/04/30 Javascript
关于windows server 2012 DC 环境 重启后蓝屏代码:0xc00002e2的问题
2022/05/25 Servers