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的文档:
fromdjango.dbimportconnection
defmy_custom_sql(self):
withconnection.cursor()ascursor:
cursor.execute("UPDATEbarSETfoo=1WHEREbaz=%s",[self.baz])
cursor.execute("SELECTfooFROMbarWHEREbaz=%s",[self.baz])
row=cursor.fetchone()
returnrow
上述方法是设置中如果有多个数据库,会默认使用default,当你想使用指定的数据库连接时,引入的对象就变成了connections!
fromdjango.dbimportconnection
defmy_custom_sql(self):
withconnection.cursor()ascursor:
cursor.execute("UPDATEbarSETfoo=1WHEREbaz=%s",[self.baz])
cursor.execute("SELECTfooFROMbarWHEREbaz=%s",[self.baz])
row=cursor.fetchone()
returnrow
之后再进行操作。
补充知识:Django多数据源接入类
fromrest_framework.genericsimportGenericAPIView
fromrest_framework.responseimportResponse
fromrest_frameworkimportstatus
fromdjango.dbimporttransaction
from.contantsimportdb_dict
contants.py的内容
(
importcx_Oracle
importpymysql
#定义一个数据库类型&引擎的字典,
db_dict={'mysql':pymysql,'Oracle':cx_Oracle}
)
from.modelsimportDataSystem,Rule
classDBconnectView(GenericAPIView):
__DBtype=db_dict
defget(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()
exceptExceptionase:
raisee
else:
#明显的开启事务
withtransaction.atomic():
#在安全的地方,创建保存点,将来操作数据库失败回滚到此
save_id=transaction.savepoint()
try:
#获取一个元组
db_ret=cs_ms.execute(self.check_code)
exceptExceptionase:
transaction.savepoint_rollback(save_id)
raisee
else:
db_set=db_ret.fetchone()
#transaction.savepoint_commit(save_id)
finally:
cs_ms.close()
conn.close()
returnResponse({'pk':pk,'rule_id':rule_id})
以上这篇django链接多个数据库并使用原生sql实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。