Django用原始SQL进行Insert/Update操作
2016-07-15 00:00
387 查看
一般来说,最好用 Django 自带的模型来实现这些操作。这里仅仅只是为了学习使用原始 SQL 而做的练习。
Django 提供了非常方便的数据管理模型 models,可以完成与数据库的基本操作。但有时,Django 原始的 models 的功能可能会不太够用,这些情况下可以直接绕过模型直接访问数据库。
Django提供两种方式执行(performing)原始的SQL查询:
Manager.raw():执行原始查询并返回模型实例
Executing custom SQL directly:直接执行自定义SQL,这种方式可以完全避免数据模型,而是直接执行原始的SQL语句。
先上程序,再解释。
下面的函数,获取表单传递过来的 POST 数据,然后执行 Insert/Update 操作。
一些语句的大概解释:
django.db.connection,代表了默认的数据库连接,
django.db.transaction,代表默认的数据库事务。
counnection.cursor,代表默认数据库游标。
cursor.execute(sql,[params]),执行sql语句。
cursor.fetchone()或cursor.fetchall(),返回查询的结果。
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 知晓哪些修改必须被提交。
Django 提供了非常方便的数据管理模型 models,可以完成与数据库的基本操作。但有时,Django 原始的 models 的功能可能会不太够用,这些情况下可以直接绕过模型直接访问数据库。
Django提供两种方式执行(performing)原始的SQL查询:
Manager.raw():执行原始查询并返回模型实例
Executing custom SQL directly:直接执行自定义SQL,这种方式可以完全避免数据模型,而是直接执行原始的SQL语句。
先上程序,再解释。
下面的函数,获取表单传递过来的 POST 数据,然后执行 Insert/Update 操作。
from django.views.decorators.csrf import csrf_exempt from django.db.transaction import commit_on_success import MySQLdb @csrf_exempt @commit_on_success def add_post(request): from django.db import connection, transaction title = request.POST.get('title', False) vicetitle = request.POST.get('vice_title', False) digest = request.POST.get('digest', False) content = request.POST.get('content', False) db = MySQLdb.connect(user='root', db='testdb', passwd='', host='localhost', charset='utf8') #cursor = db.cursor() cursor = connection.cursor() #cursor.execute("INSERT INTO nowamagic (title, vicetitle, digest, content) values (%s, %s, %s, %s)", [title, vicetitle, digest, content]) cursor.execute("UPDATE chika SET title = '3333' WHERE id = '2'") transaction.commit_unless_managed() #transaction.set_dirty() db.close() return render_to_response('test.html', context_instance=RequestContext(request))
一些语句的大概解释:
django.db.connection,代表了默认的数据库连接,
django.db.transaction,代表默认的数据库事务。
counnection.cursor,代表默认数据库游标。
cursor.execute(sql,[params]),执行sql语句。
cursor.fetchone()或cursor.fetchall(),返回查询的结果。
transaction.commit_unless_managed(),事务提交,确保数据更改(在更改数据库时使用,如果查询操作没必要使用)
如果你正在使用事务装饰器(例如 commit_on_success)来修饰视图和提供事务控制。你不必手动调用 transaction.commit_unless_managed(),当然如果你愿意的话,可以手动调用,但是一般情况下用不着这么做,这是因为装饰器会为你自动提交事务。但是,如果你不手动提交修改,你需要使用 transaction.set_dirty() 将事务标识为已脏。
@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() return render_to_response('template.html', {'row': row})
使用 Django ORM 对数据库进行修改时,Django 会自动调用 set_dirty() 。但如果你使用了原始 SQL ,Django 就无法获得你的 SQL 是否修改了数据。只有手动调用 set_dirty() 才能确保 Django 知晓哪些修改必须被提交。
相关文章推荐
- SQL Server自动化运维系列——监控跑批Job运行状态
- golang的sql.DB的一些注意事项及读写锁的总结
- 安卓sqllitehelper 继承SQLiteOpenHelper
- MySQL主从复制的维护脚本
- mysql 重要维护工具 图解
- Sql server 维护计划-备份
- MySQL监控模板说明-Percona MySQL Monitoring Template for Cacti
- Mysql提示 “ Got a packet bigger than 'max_allowed_packet' bytes”
- PL/SQL Developer 导出数据
- 使用Django的models创建mysql数据库
- Mysql在大型网站的应用架构演变
- sqoop将postgresql表导入hive表
- 使用 Oracle SQL Developer 开发和调试 PL/SQL
- 【hadoop】Hadoop,MapReduce操作Mysql(比较早的操作方法,可以看看)
- ogr2gor sqlserver转geojson
- Django连接MySql
- 解决oracle 10g sql *plus 用dbms_output.put_line()输出时的长度限制问题 ORA-20000: ORU-10028: line le
- Linux主机和MySQL实时监控工具-orzdba
- 使用SparkSQL分析CSDN泄露的用户数据[top-n]
- Android 存储方式之SharedPreference SQLite ContentProvider