Django中直接执行SQL语句
欢迎加入python学习交流群 667279387
今天在django views.py看到同事写的代码里面有段关于数据库查询的语句。因为涉及多个表的查询,所以django 的models的查询无法满足需求,所以直接执行了SQL语句。他是按照下面的方法实现的。
try:
connection = MySQLdb.connect(host=SQL_IP,
user=SQL_USER,
passwd=SQL_PASSWD,
db=SQL_DB, charset='utf8')
cursor = connection.cursor()
cmd_query = query_data(request)
data_sort = sort_data(request)
cmd = "set session group_concat_max_len = 8000;"
cursor.execute(cmd)
......
看到这段代码,感觉应该重复造了轮子,数据库的链接应该交由django这个框架处理的。于是查看了下官方文档。
django.db.connection 就是上面的同事写的那个connection了。
后面的方法同他的一样执行就是了。即执行
connection.cursor()
cursor.execute(sql, [params])
cursor.fetchone() or cursor.fetchall()
下面是一个简单的例子。
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.db.connection也能很方便的选取数据库。django.db.connections 是一个类字典的结构,允许你使用数据库别名获取connection。
from django.db import connections
with connections['my_db_alias'].cursor() as cursor:
# Your code here...
使用with作为上下文管理器:
with connection.cursor() as c:
c.execute(...)
和下面这段代码等效
c = connection.cursor()
try:
c.execute(...)
finally:
c.close()
注意的问题:
如果你做了更新或者插入操作需要在代码中使用 :transaction.commit_unless_managed() 来提交数据。或者使用事务装饰器(例如 commit_on_success)来修饰视图和提供事务控制数据提交。这样就不用在代码中调用transaction.commit_unless_managed()。但是,如果你不手动提交修改,你需要使用 transaction.set_dirty() 将事务标识为已脏。使用 Django ORM 对数据库进行修改时,Django 会自动调用 set_dirty() 。但如果你使用了原始 SQL ,Django 就无法获得你的 SQL 是否修改了数据。只有手动调用 set_dirty() 才能确保 Django 知晓哪些修改必须被提交。
from django.db.transaction import commit_on_success
@commit_on_success
def my_custom_sql_view(request, value):
from django.db import connection, transaction
cursor = connection.cursor()
# Data modifying operation
cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [value])
# Since we modified data, mark the transaction as dirty
transaction.set_dirty()
# Data retrieval operation. This doesn't dirty the transaction,
# so no call to set_dirty() is required.
cursor.execute("SELECT foo FROM bar WHERE baz = %s", [value])
row = cursor.fetchone()
#transaction.commit_unless_managed()
return render_to_response('template.html', {'row': row})
如果不使用
参考文献:
1、https://docs.djangoproject.com/en/2.0/topics/db/sql/
欢迎加入python学习交流群 667279387
Django中直接执行SQL语句的更多相关文章
- SQL*PLUS中批量执行SQL语句
SQL*PLUS中批量执行SQL语句 今天由于工作的需要,要在CMD中批量执行大量的SQL语句,对于Oracle学习还处在入门阶段的我,只能硬着头皮到处去寻找资料(主要是网络资料,也包括自己的电子书) ...
- Eclipse中直接执行sql语句(图文说明)
转自:https://blog.csdn.net/changjyzzu/article/details/45487847 1.首先新建sql文件,然后打开文件 22.右键点击空白处,点击set-con ...
- 在django中使用原生sql语句
raw # row方法:(掺杂着原生sql和orm来执行的操作) res = CookBook.objects.raw('select id as nid from epos_cookbook whe ...
- 关于EF中直接执行sql语句的参数化问题
某天 , 在review项目中代码的时候, 发现有哥们直接通过 Database.ExecuteSqlCommand("select * from order_info where com ...
- SQLSERVER 在PROCEDURE 中动态执行SQL语句【EXEC】并获取
1.直接上代码 CREATE PROCEDURE [dbo].[TEST] AS BEGIN DECLARE )='N8-4F', --構建SQL需要的條件 ),--構建後的SQL語句 @cnt in ...
- linq直接执行sql语句
1.ExecuteQuery方法 看命名,我们很容易联想到ado.net里熟悉的Command的ExecuteNonQuery方法,但是VS的智能提示告诉我们这个方法返回的是一个泛型集合,应该&quo ...
- PL/SQL中直接写SQL语句和用EXECUTE IMMEDIATE方法的区别
PL/SQL中直接写SQL语句和用EXECUTE IMMEDIATE方法的区别 在PL/SQL中在执行SQL语句时可以直接写SQL或者可以把一个SQL语句拼成一个字符串,如下: select * fr ...
- EF中执行sql语句,以及事务
EF to sql string sql = "select T_Task.BSID,T_Task.CloseDate,T_Task.CompleteDate,T_Task.CloseUse ...
- 使用Hive或Impala执行SQL语句,对存储在HBase中的数据操作
CSSDesk body { background-color: #2574b0; } /*! zybuluo */ article,aside,details,figcaption,figure,f ...
随机推荐
- python线程threading.Timer源码解读
threading.Timer的作用 官方给的定义是: """Call a function after a specified number of seconds: t ...
- dhcpv6+radvd服务器搭建
1.isc-dhcp-server install sudo apt update sudo apt-get install isc-dhcp-server 2.设置dhcp 创建/etc/dhcp/ ...
- egret开发方法(最笨的方法)
egret开发方法(最笨的方法)1 1个精灵1个对象名字 获取精灵设置属性也是直接获取对象设置属性 (不用想的少些代码 因为没有jquery好用) ps:如果要设置很多个精灵属性 那可以添加到数组 然 ...
- HTML和css面试题:内容转载
1.常见的块级元素 内联元素 div -最常用的块级元素 dl - 和dt-dd 搭配使用的块级元素 form - 交互表单 h1 -h6- 大标题 hr - 水平分隔线 ol – 有序列表 p - ...
- 【Linux】Debian 下安装 Apache,MySQL,PHP
首先,对你的源进行更新: $ sudo apt-get update 第一步--安装 Apache Apache 是一个开源软件,它目前运行在全球超过 50% 的服务器上,是 LAMP(Linux,A ...
- pat 1084 Broken Keyboard(20 分)
1084 Broken Keyboard(20 分) On a broken keyboard, some of the keys are worn out. So when you type som ...
- Pashmak and Graph(dp + 贪心)
题目链接:http://codeforces.com/contest/459/problem/E 题意:给一个带权有向图, 找出其中最长上升路的长度. 题解:先按权值对所有边排序, 然后依次 u -& ...
- PHP产生不重复随机数的5个方法总结
无论是Web应用,还是WAP或者移动应用,随机数都有其用武之地.在最近接触的几个小项目中,我也经常需要和随机数或者随机数组打交道,所以,对于PHP如何产生不重复随机数常用的几种方法小结一下 无论是We ...
- IPv6,无需操作就可升级?
最近这段时间,5G 出现在你能看到的各种信息里,铺天盖地的宣传提醒着大家新一代互联网的到来.其实早在几年前 5G 就有所提及,可是为什么到现在才开始窜上热门呢?这就涉及到了 IPv6. 或许有不少朋友 ...
- Java关于Resource leak: 's' is never closed的问题
Resource leak: 's' is never closed的问题 问题:在编写Java时出现了Resource leak: 's' is never closed的问题,也就是对象s下面的波 ...