python模塊分析之sqlite3數據庫


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

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM