python--sqlite3 module

sqlite介绍:


SQLite,是一款轻量级的数据库,它的设计目标是嵌入式领域,占用资源非常的低。它能够支持Windows/Linux/Unix等等主流平台,同时能够跟很多程序语言相结合。利用sqlite可以进行轻量级开发,或者原型。

sqlite  official website: http://www.sqlite.org/

辅助工具:sqlite expert pro



python  sqlite3 module:


为了使用sqlite3模块,你必须首先创建Connection对象,如:

import sqlite3
conn = sqlite3.connect('example.db')
 

你也可以使用:memory:来创建一个RAM数据库。


一旦你有了connection对象,你可以创建cursor对象并调用其execute()方法来执行sql:

c = conn.cursor()

# Create table
c.execute('''CREATE TABLE stocks
             (date text, trans text, symbol text, qty real, price real)''')

# Insert a row of data
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")

# Save (commit) the changes
conn.commit()

# We can also close the connection if we are done with it.
# Just be sure any changes have been committed or they will be lost.
conn.close()

请不要使用python的变量来填充sql 操作语句,因为它不安全,容易受到SQL注入攻击。

正确是使用方法是使用 ? 作为一个占位符,来代表一个python value.

# Never do this -- insecure!
symbol = 'RHAT'
c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)

# Do this instead
t = ('RHAT',)
c.execute('SELECT * FROM stocks WHERE symbol=?', t)
print c.fetchone()

# Larger example that inserts many records at a time
purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
             ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00),
             ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
            ]
c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases)


为了获取SELECT执行后的数据,你可以使用cursor's fetchone()方法一个一个的获取,也可以使用fetchall()获取全部(list).

>>> for row in c.execute('SELECT * FROM stocks ORDER BY price'):
        print row

(u'2006-01-05', u'BUY', u'RHAT', 100, 35.14)
(u'2006-03-28', u'BUY', u'IBM', 1000, 45.0)
(u'2006-04-06', u'SELL', u'IBM', 500, 53.0)
(u'2006-04-05', u'BUY', u'MSFT', 1000, 72.0)


11.13.1. Module functions and constants

sqlite3.version          The version number of this module, as a string. This is not the version of the SQLite library.
sqlite3.version_info           The version number of this module, as a tuple of integers. This is not the version of the SQLite library.
sqlite3.sqlite_version           The version number of the run-time SQLite library, as a string.
sqlite3.sqlite_version_info       The version number of the run-time SQLite library, as a tuple of integers.
sqlite3.PARSE_DECLTYPES         此常量意味着和connect()函数中的detect_type参数配合使用。用法见下面

sqlite3.PARSE_COLNAMES           此常量意味着和connect()函数中的detect_type参数配合使用。用法见下面


sqlite3.connect(database[,timeout,detect_types,isolation_level,check_same_thread,factory,cached_statements])
        连接数据库database。可以使用 ":memory:"连接一个RAM数据库。

        当一个数据库被多个进程访问时,当一个进程修改数据时,数据库被加锁直到事物被提交后才解锁。timeout参数指定连接时长,如果超过时长则抛出异常。默认值为5s。

        对于isolation_level参数,请参见后面所述。

        SQLite本身只支持TEXT, INTEGER, FLOAT, BLOB and NULL。如果你想支持更多类型,你就要自己去添加支持。使用detect_typesregister_converter()能够让你很容易的实现。detect_types默认为0,你可以设置为PARSE_DECLTYPESPARSE_COLNAMES的任何组合形式。

         sqlite3模块内部使用sql语句缓存来避免SQL解析超出负载。默认为100.



sqlite3.register_converter(typename,callable)             注册一个可调用对象,用来转换数据库bytestring到自定义的python数据类型。当值为typename时callable对象将被调用。


sqlite3.register_adapter(type,callable)            跟register_converter相反吧。


sqlite3.complete_statement(sql)             只是根据分号来简单检查sql  string是否完整,而对sql的语法不予检查。

 

# A minimal SQLite shell for experiments

import sqlite3

con = sqlite3.connect(":memory:")
con.isolation_level = None
cur = con.cursor()

buffer = ""

print "Enter your SQL commands to execute in sqlite3."
print "Enter a blank line to exit."

while True:
    line = raw_input()
    if line == "":
        break
    buffer += line
    if sqlite3.complete_statement(buffer):
        try:
            buffer = buffer.strip()
            cur.execute(buffer)

            if buffer.lstrip().upper().startswith("SELECT"):
                print cur.fetchall()
        except sqlite3.Error as e:
            print "An error occurred:", e.args[0]
        buffer = ""

con.close()

sqlite3.enable_callback_tracebacks(flag)              flag为True的时候,可对上面的callbacks进行traceback.......................


11.13.2. Connection Objects

isolation_level

         Get or set the current isolation level.None for autocommit mode or one of “DEFERRED”, “IMMEDIATE” or “EXCLUSIVE”. See sectionControlling Transactions for a more detailed explanation。



cursor([cursorClass])           The cursor method accepts a single optional parametercursorClass. If supplied, this must be a custom cursor class that extendssqlite3.Cursor.


commit()

         该方法用于提交事务。如果你忘记提交,则前面的操作都会没效果的。


rollback()          回滚至最后一次调用commit()之前的数据。

close()

        关闭数据库连接。注意:该方法并不会自动调用commit(),如果你关闭连接时没有调用commit(),你对数据的改动将会丢失。


execute(sql[,parameters])              该方法内部会创建cursor对象并调用其execute方法,并传递parameters。


executemany(sql[,parameters])             该方法内部会创建cursor对象并调用其executemany方法,并传递parameters。



executescript(sql_script)             该方法内部会创建cursor对象并调用其executescript方法。


create_function(name,num_params,func)

           创建一个用户定义的函数,该函数可以用于sql string中,使用参数name来调用func。num_params表示参数个数。

函数可以返回任何 SQLite数据类型: unicode, str, int, long, float, buffer and None.

Example:

            
import sqlite3
import md5

def md5sum(t):
    return md5.md5(t).hexdigest()

con = sqlite3.connect(":memory:")
con.create_function("md5", 1, md5sum)
cur = con.cursor()
cur.execute("select md5(?)", ("foo",))
print cur.fetchone()[0]



create_aggregate ( name, num_params, aggregate_class )
创建一个用户定义的聚合函数。aggregate_class必须实现step方法和finalize方法。 函数可以返回任何 SQLite数据类型: unicode, str, int, long, float, buffer and None.
   
import sqlite3

class MySum:
    def __init__(self):
        self.count = 0

    def step(self, value):
        self.count += value

    def finalize(self):
        return self.count

con = sqlite3.connect(":memory:")
con.create_aggregate("mysum", 1, MySum)
cur = con.cursor()
cur.execute("create table test(i)")
cur.execute("insert into test(i) values (1)")
cur.execute("insert into test(i) values (2)")
cur.execute("select mysum(i) from test")
print cur.fetchone()[0]


create_collation(name,callable)

        创建一个collation。有两个参数传递给callable。如果第一个参数比第二个“小”则返回-1,相等则返回0,否则返回1.  传递给callable的参数是python bytestrings,一般是UTF8编码。


下面的例子展示了“错误的”方式:
import sqlite3

def collate_reverse(string1, string2):
    return -cmp(string1, string2)

con = sqlite3.connect(":memory:")
con.create_collation("reverse", collate_reverse)

cur = con.cursor()
cur.execute("create table test(x)")
cur.executemany("insert into test(x) values (?)", [("a",), ("b",)])
cur.execute("select x from test order by x collate reverse")
for row in cur:
    print row
con.close()



interrupt()

       你可以在多线程中调用该方法来中断查询。被中断的查询将会抛出异常。



set_authorizer(authorizer_callback)

              注册审计回调。


set_progress_handler(handler,n)

           SQLite虚拟机每执行n条指令的时候调用handler,当长时间执行操作的时候,可能会很有用,比如在GUI中现实执行进度。





11.13.3. Cursor Objects

  

execute(sql[,parameters])

只能执行一条SQL语句 。支持两种占位符:

import sqlite3

con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("create table people (name_last, age)")

who = "Yeltsin"
age = 72

# This is the qmark style:
cur.execute("insert into people values (?, ?)", (who, age))

# And this is the named style:
cur.execute("select * from people where name_last=:who and age=:age", {"who": who, "age": age})

print cur.fetchone()



executemany(sql,seq_of_parameters)

 将sql语句与序列对应,多次执行sql语句。也可使用迭代来代替序列。

  
import sqlite3
import string

def char_generator():
    for c in string.lowercase:
        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()

executescript(sql_script)

首先产生一个COMMIT语句,然后执行sql_script 。 看下例子:

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
    );
    """)


fetchone()         .获取查询结果集中的下一条记录。
fetchmany([size=cursor.arraysize])              返回多个记录。每次获取记录的数量依赖于size参数。如果size没有给出,则arraysize属性决定了返回记录的数量。
fetchall()             返回所有的查询记录集。注意,arraysize属性能够影响该操作的效率。当查询结果集没有记录时返回空的list。
rowcount

lastrowid             一个只读属性,表示最后一次更改的记录号。当只有使用execute执行INSERT语句的时候该属性才被设置。
description



11.13.4. Row Objects

class sqlite3.Row
row实例是一个高度优化的row_factory。它的行为很像tuple.它支持索引访问和列名访问。支持iteration, representation, equality testing and len().
keys()

返回列名称的tuple.

调用示例:

conn = sqlite3.connect(":memory:")
c = conn.cursor()
c.execute('''create table stocks
(date text, trans text, symbol text,
 qty real, price real)''')
c.execute("""insert into stocks
          values ('2006-01-05','BUY','RHAT',100,35.14)""")
conn.commit()
c.close()


>>> conn.row_factory = sqlite3.Row
>>> c = conn.cursor()
>>> c.execute('select * from stocks')
<sqlite3.Cursor object at 0x7f4e7dd8fa80>
>>> r = c.fetchone()
>>> type(r)
<type 'sqlite3.Row'>
>>> r
(u'2006-01-05', u'BUY', u'RHAT', 100.0, 35.14)
>>> len(r)
5
>>> r[2]
u'RHAT'
>>> r.keys()
['date', 'trans', 'symbol', 'qty', 'price']
>>> r['qty']
100.0
>>> for member in r:
...     print member
...
2006-01-05
BUY
RHAT
100.0
35.14




     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值