django 链接多个数据库 并使用原生sql实现
作者:喝完这杯还有一箱 发布时间:2024-01-23 12:52:06
标签: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])
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})
来源:https://blog.csdn.net/qq_37049050/article/details/85131514


猜你喜欢
- MATLAB转格式,需要使用spm package(https://github.com/neurodebian/spm12).%%img2
- 上一篇:微软建议的ASP性能优化28条守则(7)技巧 22:尽可能使用 Server.Transfer 代替 Response.Redire
- 版本更新,原来user里的password字段已经变更为authentication_string版本更新 缘故,好多网上的教程都不适用了,
- 报错:raise MissingSchema(requests.exceptions.MissingSchema: Invalid URL
- 计是一个输入-输出的过程,因为首先有用户的需求,客户的项目才有设计的产生,设计是带有目的性和市场行为的,当然也有一部分的创造性设计,仅仅为了
- 1、何为ansible-playbookplaybook是ansible用于配置,部署,和管理被控节点的剧本,通过playbook的详细描述
- 使用re, urllib, threading多线程抓取天涯帖子内容,设置url为需抓取的天涯帖子的第一页,设置file_name为下载后的
- 爬虫数据保存到mongoDB的方法:import pymongo# 首先需要注意,mongodb数据库存储的类型是以键值
- 1、首先访问http://www.python.org/download/去下载最新的python版本。2、安装下载包,一路next。3、为
- Python Assert 为何不尽如人意?Python中的断言用起来非常简单,你可以在assert后面跟上任意判断条件,如果断言失败则会抛
- 前言本文章仅记录某次内网渗透过程中遇到的MySQL 采用UDF提权等方式进行获取权限,文章中内容仅用于技术交流,切勿用于非授权下渗透攻击行为
- 纵观各大编程语言在 2017 年的发展情况,我们会发现涌现出诸如 Go、Swift 这类后起之秀,而其中最为耀眼的当属 Python。之所以
- 前言废话滑块验证码破解是一直都想搞的项目,毕竟多数网站都会采用滑块验证码,于是最近在修改论文的闲暇之余把这事儿给解决了。要搞现在的滑块验证码
- 目录abspathbasenamedirnameexistsgetatimegetctimegetsizeisabsisdirisfilei
- 1、集合相加a = {1,2,3}b = {3,4,5}print(type(a))print(a|b)2、queryset 符合条件的筛序
- 先说一下最土的一种方法:Html:<div class="tab-head">
- 我就废话不多说了,直接上代码吧!#2.14from turtle import *from time import sleepdef go_
- 前言matplotlib 是Python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图。本文将以例子
- channelGo语言中的通道(channel)是一种特殊的类型。在任何时候,同时只能有一个 goroutine 访问通道进行发送和获取数据
- 我的需求:手动配置X轴、Y轴、图表标题等参数自动通过Pyecharts模块生成可视化的html数据图表,并将浏览器图表展示到UI界面上。制作