SQLite作為一種應用廣泛的文件式關系型數據庫,python操作sqlite主要有兩種方式,原生SQL語句和ORM映射工具。
SQLAlchemy連接SQLITE
SQLAlchemy是一款優秀的python連接關系型數據庫的ORM工具,支持SQLite,MYSQL,ORICLE等多種關系型數據庫,具體使用:
參見:http://docs.jinkan.org/docs/flask/patterns/sqlalchemy.html
這里主要記錄一下SQLAlchemy連接SQLITE的配置方法:
from sqlalchemy import create_engine
# 在Unix/Mac
engine = create_engine('sqlite:////tmp/test.db', convert_unicode=True) # /tmp/test.db為數據庫文件的絕對路徑
engine = create_engine('sqlite:///tmp/test.db', convert_unicode=True) # tmp/test.db為數據庫文件的相對路徑
# 在Windows
engine = create_engine('sqlite:///C:\\path\\to\\foo.db') # C:\\path\\to\\foo.db為絕對路徑,需要轉義
engine = create_engine(r'sqlite:///C:\path\to\foo.db') # 在Windows 中使用原始字符串
# 使用內存作為數據庫容器
engine = create_engine('sqlite://')
engine = create_engine('sqlite:///:memory:')
py-sqlite3連接SQLITE
python內部已經自帶了連接sqlite的模塊和sqlite數據庫引擎,不需要安裝。
創建連接
import sqlite3
conn = sqlite3.connect('/tmp/test.db') # 連接指定位置的數據庫文件,俄國不存在將被創建
conn.close() # 關閉連接
# 由於關閉連接連接這個操作很頻繁並且必要,提供了基於上下文管理的功能
with sqlite3.connect('/tmp/test.db') as conn:
"do something.."
執行sql語句
# 我們通過獲取游標來執行語句
with sqlite3.connect('/tmp/test.db') as conn:
cu = conn.cursor()
cu.execute('select * from users WHERE username=xiao') # 執行SQL語句
cu.close() # 關閉游標
conn.commit() # 提交
cu.execute('select * from users WHERE username=xiao') # 執行一條SQL語句
cu.executemany("insert into test values(?, ?, ?)", [(),(),()]) # 執行多條SQL語句
-
注意execute函數的第二個參數必須是元組,否則報錯。
-
注意不要采用拼接字符串的方式寫SQL語句,否則容易遭到注入攻擊。
x = 'xiao'
cu.execute('select * from users WHERE username=%s'%x) # 這種方式不可取
# 使用?作為占位符
cu.execute('select * from users WHERE username=?',('xiao',))
- 獲取查詢結果
ls = cu.execute('select * from users WHERE username=?',('xiao',)) # 返回一個迭代器
ls.fetchone() # 一條記錄的元組
ls.fetchall() # 一個元組列表,查詢后最好取一次,因為迭代器不可逆
ls.fetchmany(size) # 指定獲取的數目,返回一個列表,無參數默認獲取所有
- 常用的方法
conn.commit():事務提交
conn.rollback():事務回滾
conn.close():關閉一個數據庫連接
conn.cursor():創建一個游標
典型代碼結構
# 插入一條數據
import sqlite3
from sqlite3 import Connection
from contextlib import contextmanager
from decorator import decorator
# 使用上下文管理器管理游標
@contextmanager
def get_cursor(conn:Connection):
cu = conn.cursor()
try:
yield cu
finally:
cu.close()
with sqlite3.connect(ADDRESS_SQL_LOCAL) as conn:
with get_cursor(conn) as cu:
try:
cu.execute('insert into users(username,sex,age,tele) VALUES (?,?,?,?)',
(kwargs.get('username'),
kwargs.get('sex', 'M'),
kwargs.get('age', 20),
kwargs.get('tele', '')))
conn.commit()
return 1
except Exception as e:
conn.rollback() # 存在異常需要回滾數據
raise Exception('insert the data:{}'.format(e))