最後更新: 2015-04-21
Version
# 匯入 sqlite3 的 class
>>> import sqlite3
# Class 的 version
>>> sqlite3.version_info
(2, 4, 1)
# engine version:
>>> sqlite3.sqlite_version_info
(3, 7, 3)
應用流程
建立 Connection Objects
建立 Cursor Objects <--- Default: tuples(sqlite3.Row) (如果想用 dict, 那就要 con.row_factory = dict_factory)
建立 Row Object
一般使用 (connect(), cursor(), execute(), commit(), close())
# 建立 connection:
conn = sqlite3.connect('example.db')
# 當 DB 不存在時, 那會自己建立它:
# special name :memory: to create a database in RAM.
# 一切操作都是透過 cursor 來實現 !
cur = conn.cursor()
# 執行 SQL:
>>> cur.execute("create table accesslog( username text, atime text, success integer)")
<sqlite3.Cursor object at 0xf728dd40>
>>> cur.execute("INSERT INTO accesslog VALUES ('datahunter','2012-12-5',1)")
<sqlite3.Cursor object at 0xf728dd40>
# 所有 insert 的動作都要 commit 才會寫入
conn.commit() # result 永遠都是 null 的
# close() 是沒有包含 commit 的!!
conn.close()
拿出 Data
* 一共有兩個方法拿 Data (fetchone(), fetchall())
fetchone()
Fetches the next row of a query result set, returning a single sequence, or None when no more data is available.
result: <type 'tuple'>
fetchall()
Fetches all (remaining) rows of a query result, returning a list.
result: <type 'list'>
rows = cur.fetchall() for row in rows: print row
支援 list 及 dict 的架取
list:
result = cursor.execute('''SELECT name, email, phone FROM users''')
for row in result:
print('{0} : {1}, {2}'.format(row[0], row[1], row[2]))
dict:
result = cursor.execute('''SELECT name, email, phone FROM users''') for row in result: # row['name'] returns the name column in the query, row['email'] returns email column. print('{0} : {1}, {2}'.format(row['name'], row['email'], row['phone']))
完整的 Code:
try: con = lite.connect('test.db') cur = con.cursor() cur.execute('SELECT SQLITE_VERSION()') data = cur.fetchone() print "SQLite version: %s" % data except lite.Error, e: print "Error %s:" % e.args[0] sys.exit(1) finally: if con: con.close()
進階 execute
多行:
cur.executescript(""" ....................... """)
Example
con.executescript(""" insert into users (name) values ('tester1'); insert into users (name) values ('tester2'); insert into users (name) values ('tester3'); """)
Placeholders:
tuple:
cur.execute("UPDATE Cars SET Price=? WHERE Id=?", (uPrice, uId))
當只有一個 placehoder 時
res = cur.execute("select * from users where uid=?",(1,))
dict:
cur.execute("SELECT Name, Price FROM Cars WHERE Id=:Id", {"Id": 123})
# ? = placeholders(tuple)
# :s = placeholders(dict)
insert 與 lastrowid
c = conn.cursor()
result = c.execute("INSERT INTO username VALUES ('datahunter")
conn.commit()
rowid = c.lastrowid
conn.close()
# result 永遠都是 null 的
Delete
conn = sqlite3.connect('./db/cms.sqlite3')
cur = conn.cursor()
result = cur.execute("delete from address where aid = ?", (self.rowid, ))
conn.commit()
conn.close()
# result 永遠都是 null 的
插入大量資料: list
userlist = (
(1, 'test1', 1234),
(2, 'test2', 2345),
)
con = sqlite3.connect('test.db')
cur = con.cursor()
result = cur.executemany("INSERT INTO Cars VALUES(?, ?, ?)", userlist)
# result 永遠都是 null 的
DOC