Python之Django框架封装SQL实现复杂功能

2017-11-13  本文已影响0人  bob_python

当model满足不了需求的时候(比如:存储过程、多表连接等),可以使用原生sql。

django提供了两种方法使用原生的sql:

    1、使用Manager.raw()执行原生sql,它会返回model实例

    2、直接执行原生sql,完全忽略model。警告:使用原生sql的时候,要尽可能的使用参数的形式以防止用户进行sql注入攻击。

#代码#:

def my_custom_sql():

from django.db import connection, transaction

cursor = connection.cursor()

# Data modifying operation - commit required

cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])

transaction.commit_unless_managed()

# Data retrieval operation - no commit required

cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])

row = cursor.fetchone()

return row

#对象django.db.connection代表默认的数据库连接,而django.db.transaction代表默认的数据库事务。通过调用connection.cursor()得到数据库游标对象--可以查询也可以做增删改操作。然后调用cursor.execute(sql, [params])执行sql语句,并且我们可以使用cursor.fetchone()获取一条记录,也可以使用cursor.fetchall()获取所有记录。如果执行的sql语句修改了数据库中的内容,那么可以调用transaction.commit_unless_managed()提交所作的修改,获取数据的操作则没有调用提交函数的必要。


fetchone() :

返回单个的元组,也就是一条记录(row),如果没有结果 则返回 None

fetchall() :

返回多个元组,即返回多个记录(rows),如果没有结果 则返回 ()

需要注明:在MySQL中是NULL,而在Python中则是None

用法如下所示:

fetchone()用法:

cur.execute("select host,user,password from user where user='%s'" %acc)

jilu = cur.fetchone()  ##此时 通过 jilu[0],jilu[1],jilu[2]可以依次访问host,user,password

fetchall()用法:

cur.execute("select * from user")

如果select本身取的时候有多条数据时:

cursor.fetchone():将只取最上面的第一条结果,返回单个元组如('id','title'),然后多次使用cursor.fetchone(),依次取得下一条结果,直到为空。

cursor.fetchall() :将返回所有结果,返回二维元组,如(('id','title'),('id','title')),

如果select本身取的时候只有一条数据时:

cursor.fetchone():将只返回一条结果,返回单个元组如('id','title')。

cursor.fetchall() :也将返回所有结果,返回二维元组,如(('id','title'),),

备注:其中的id和title为具体的内容

python在mysql在使用fetchall或者是fetchone时,综合起来讲,fetchall返回二维元组(元组中含有元组),fetchone只返回一维元组。

上一篇 下一篇

猜你喜欢

热点阅读