Django中直接执行SQL语句
来源:互联网 发布:上海知楚仪器股权 编辑:程序博客网 时间:2024/06/06 01:05
欢迎加入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 connectiondef 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 connectionswith 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_successdef 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语句
- python django直接执行sql语句
- django 直接执行SQL
- django 直接执行mysql 语句
- asp.net中直接执行sql语句
- AM中 直接执行SQL语句
- 如何在Django中直接使用sql语句
- django执行自定义sql语句
- mybatis直接执行sql语句
- yii 直接执行SQl语句
- Yii - 直接执行SQL语句
- mybatis直接执行sql语句
- Yii 直接执行SQL语句
- Hibernate直接执行SQL语句
- mybatis直接执行sql语句
- Eclipse中直接执行sql语句(图文说明)
- Java中直接执行sql语句,返回List集合
- Linq to sql直接执行sql语句
- mycat分片部署例子
- 封装:钩子注册全局组合快捷键
- 把单链表按某值划分成左边小,中间相等,右边大的形式,时间O(n),空间O(1)
- pyCharm、Webstorm,IDEA最新2017激活码
- Anaconda学习使用总结
- Django中直接执行SQL语句
- 关于Fisher信息阵自然梯度摘录
- CSS 变量教程
- JPEG系列二 JPEG文件中的EXIF(上)
- python -- 内部实现
- Windows 远程桌面连接 Ubuntu server
- Visual C++异常处理机制原理与应用(五)——C/C++结构化异常处理之try-except异常处理的使用(下)
- Android JNI开发(9)--JNI中防止内存泄漏
- 微信小程序实现tab和swiper切换结合效果viewpage+tab效果