Django多数据源接入类

本文介绍了一个使用RESTful API实现的数据库连接与事务管理功能,包括数据库类型选择、连接建立、执行SQL查询及异常处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值