13.13.3 游标对象
游标实例有下列属性和方法:execute(sql, [parameters])
执行一个SQL语句。该SQL语句可以是参数(如,占位符替代SQL语法)。sqlite3模块支持两种占位符:问号(qmark风格)和命名占位符(命名风格)。
这个例子展示了如果用qmark风格使用参数:
import sqlite3
con = sqlite3.connect("mydb")
cur = con.cursor()
who = "Yeltsin"
age = 72
cur.execute("select name_last, age from people where name_last=? and age=?", (who, age))
print cur.fetchone()
作为文本下载(原始的文件名:sqlite3/execute_1.py)。
这个例子展示了如何使用命名风格:
import sqlite3
con = sqlite3.connect("mydb")
cur = con.cursor()
who = "Yeltsin"
age = 72
cur.execute("select name_last, age from people where name_last=:who and age=:age",
{"who": who, "age": age})
print cur.fetchone()
作为文本下载(原文件名:sqlite3/execute_2.py)。
execute()将仅执行一个单一的SQL语句。如果你试图使用它执行多个语句,它将挂起一个警告。如果你想一次调用执行多个SQL语句,使用executescript()。
executemany(sql, seq_of_parameters)
逆向序列sql中所有的参数序列或映射执行一个SQL命令。sqlite3模块也允许用一个产生参数的迭代替代序列。
import sqlite3
class IterChars:
def __init__(self):
self.count = ord('a')
def __iter__(self):
return self
def next(self):
if self.count > ord('z'):
raise StopIteration
self.count += 1
return (chr(self.count - 1),) # this is a 1-tuple
con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("create table characters(c)")
theIter = IterChars()
cur.executemany("insert into characters(c) values (?)", theIter)
cur.execute("select c from characters")
print cur.fetchall()
作为文本下载(原文件名:sqlite/executemany_1.py)。
这是一个使用生成器的短小的例子:
import sqlite3
def char_generator():
import string
for c in string.letters[:26]:
yield (c,)
con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("create table characters(c)")
cur.executemany("insert into characters(c) values (?)", char_generator())
cur.execute("select c from characters")
print cur.fetchall()
作为文本下载(原文件名:sqlite3/executemany_2.py)。
executescript(sql_script)
这是一个一次执行多个SQL语句的非标准的便洁的方法。首先,它发表一个COMMIT声明,然后执行作为参数获取的SQL脚本。
sql_script可以是字节字符串或Unicode字符串。
例子:
import sqlite3
con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.executescript("""
create table person(
firstname,
lastname,
age
);
create table book(
title,
author,
published
);
insert into book(title, author, published)
values (
'Dirk Gently''s Holistic Detective Agency',
'Douglas Adams',
1987
);
""")
作为文本下载(原文件名:sqlite3/executescript.py)。
rowcount
虽然sqlite3模块的Cursor类实现这个属性,但是数据库引擎自己支持的"rows affected"/"rows selected"声明是多变的。
对于SELECT语句,rowcount一直为None,因为我们不能判定一个查询产生的行数直到所有的行被取出。
对于DELETE语句,如果没有用任何条件从表中做出一个删除,SQLite报告rowcount为0。
对于executemany语句,改变的数目被计算入rowcount。
Python DB API规范需求,rowcount属性为-1万一在游标上没有executeXX()被执行或最后操作的rowcount没有通过该接口判定。
出处[url=http://www.okpython.com]PYTHON中国[/url],关于手册翻译的任何事情请EMAIL给我[email=zkfarmer@gmail.com]zkfarmer[/email],最新文档在我的[url=http://www.zkfarmer.org]site[/url]。[color=Red]请参阅官方英文文档[/color]。 好久不见,顶 不好意思,上周家中的小公主生病住院了,呵呵,耽误了一个星期!
页:
[1]