• Django用原始SQL进行Insert/Update操作

    数据库连接与事务
    服务器君一共花费 9.033 ms 进行了 3 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    一般来说,最好用 Django 自带的模型来实现这些操作。这里仅仅只是为了学习使用原始 SQL 而做的练习。

    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 知晓哪些修改必须被提交。

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [Python程序设计] 写几个简单的Tornado程序吧 5 个条目
  2. [JavaScript程序设计] 关于HTTP Keep-Alive 6 个条目
  3. [Python程序设计] Django Web环境配置 2 个条目
  4. [PHP程序设计] PHP数组的遍历 7 个条目
  5. [Linux操作系统] CentOS上使用EPEL Repository 2 个条目
  6. [Python程序设计] Django模板系统 11 个条目
  7. [Python程序设计] Tornado源码解析 23 个条目
  8. [移动开发] 刷机与root相关 2 个条目
  9. [移动开发] 使用support-v7 ActionBar前的那些坑 3 个条目
  10. [Python程序设计] Django 入门知识浅介 10 个条目
  11. [PHP程序设计] Nginx基本操作释疑 7 个条目
  12. [计算机算法] TAOCP与算法 12 个条目
窗口 -- [八点]