Python's Archiver

為方便港臺同胞閱覽,Python中國特別推出簡繁體內容轉換功能

zkfarmer 发表于 2008-10-21 21:50

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]。

xieaotian 发表于 2008-10-21 21:59

好久不见,顶

zkfarmer 发表于 2008-10-21 22:06

不好意思,上周家中的小公主生病住院了,呵呵,耽误了一个星期!

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.