麦田守望者's profile异想空间PhotosBlogLists Tools Help

Blog


    7/4/2008

    使用django框架的connection对象需要注意的一点

    django允许我们执行自定义的SQL语句。首先需要import connection对象:

    from django.db import connection

    connection对象封装了db-api规范中定义的connection对象。但是dir(connection)之后并没有发现commit和rollback方法,如何提交事务呢?当执行DELETE、INSERT、UPDATE后,必须connection对象的commit方法才能将数据写入的数据库中。

    原因如下:connection对象中包含又一个connection对象,它才是真正的与实际数据库建立的connection对象。如下代码:

    connection.cursor().execute("INSERT INTO table1 (col) VALUES ('something')")
    connection.connection.commit()

    try:
      raise Exception("some thing goes wrong! :(")
    except Exception:
      connection.connection.rollback()

    能够正确执行。

    2/26/2007

    始终使用字典语法设置session对象的数据

    在使用django的session对象的时候,确保始终使用字典语法设置session中的数据。如下代码:
    request.session["myname"] = "麦田守望者"
    需要特别留意的是,如果session中存储了一个tuple或者列表对象,那么在修改完它们之后,同样也要用重新设置request.session。如下示例(没有什么实际意义,仅供示意):
    #假设,在session对象中存储了一个客户对象列表。代码将向此列表中添加新的客户
    myCustomerList = request.session["CustomerList"]
    oCustomer = Customer()
    myCustomerList.append(oCustomer)
    #这一行很重要
    request.session["CustomerList"] = myCustomerList
    按照通常的思路,myCustomerList变量已经引用了session对象中的CustomerList列表对象,经过第三行的代码列表中应该存在了新客户对象。实际上,确实存在。那么为何必需最后的一行代码?
    从django文档中得知(与session有关的文档在session.txt中),session对象需要数据库的支持,并且在每次修改session对象的时候,django会自动将其数据写入到数据库中。这是默认的,写入session对象的时机可以另作配置,详情请查看session.txt文档。由此可见,在默认情况下,只有使用字典语法设置session对象的数据,方可触发django的写session数据的行为。