編程學習網 > 編程語言 > Python > Python進階~sqlite3數據庫教程
2023
08-25

Python進階~sqlite3數據庫教程


SQLite是一種輕量級、無配置、文件型的數據庫,SQLite文件可以在不同的系統跨平臺使用,不管是32位或者64位系統,也不管是大端模式或者小端模式CPU架構。任何人可以自由的拷貝、修改、出版、使用、編譯、出售或者發布其源碼和二進制文件,不管是商業性質或者非商業性質的目的。正因為如此寬松的協議,也為了保證項目的完全自由和免受版權妨礙,SQLite不接受任何第三方貢獻代碼。SQLite源碼提供的是C/C++接口,Python3內部集成了sqlite3模塊,不需要安裝使用import sqlite3即可完成模塊的導入。


1、連接數據庫、創建游標
和大多數數據庫的使用一樣,首先需要連接數據庫,使用sqlite3.connect(數據庫文件db_name)的方法連接數據庫文件,并生成連接實例conn,如果數據庫文件db_name不存在,則自動創建數據庫文件db_name。

使用sqlite3.connect()生成實例conn的cursor()方法創建游標,游標可以用來執行sql語句。

import  sqlite3
conn = sqlite3.connect(db_name)
cursor = conn.cursor()
2、關閉游標、關閉數據庫連接
當使用完數據庫后最好使用close()方法關閉游標和數據庫連接:

cursor.close()
conn.close()
3、建表
先通過“CREATE TABLE 表名 (表頭 類型, 表頭 類型, ……)”構造sql語句,然后使用cursor.execute(sql)創建新表。

import  sqlite3
db_name = 'test.db'
table_name = 'table_juzicode'

conn = sqlite3.connect(db_name)
cursor = conn.cursor()
sql = '''CREATE TABLE '''+table_name +''' (
    _id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT,      
    price REAL,
    weight REAL
    )'''
cursor.execute(sql)    
conn.commit()

cursor.close()
conn.close()
上述代碼如果已經執行過一次并且已經建表成功,再次執行時因為數據庫文件中已經存在該表,再次建同名表就會提示sqlite3.OperationalError: table table_juzicode already exists錯誤,所以在實際使用中需要先檢查該表名是否已經存在:

print('\n-----歡迎來到www.juzicode.com')
print('-----公眾號: 桔子code/juzicode \n')   

import  sqlite3
db_name = 'test.db'
table_name = 'table_juzicode'

#連接數據庫,創建游標
conn = sqlite3.connect(db_name)
cursor = conn.cursor()
print(db_name +' 數據庫連接成功')

#檢查表名是否存在
print('檢查表名......')
sql = '''SELECT tbl_name FROM sqlite_master WHERE type = 'table' '''
cursor.execute(sql)
values = cursor.fetchall()
tables = []
for v in values:
    tables.append(v[0])
print('數據庫包含的表:',tables)

#表不存在則建表
if table_name not in tables:
    sql = '''CREATE TABLE '''+table_name +''' (
        _id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT,      
        price REAL,
        weight REAL
        )'''
    cursor.execute(sql)    
    conn.commit()
    print(table_name + ' 創建成功')
else:
    print(table_name + ' 已經存在')

#關閉游標,關閉連接
cursor.close()
conn.close()
運行結果==========
test.db 數據庫連接成功
檢查表名......
數據庫包含的表: ['table_juzicode', 'sqlite_sequence']
table_juzicode 已經存在
4、增刪改查
接下來就是常用的增刪改查,首先構造sql語句,然后用cursor.excute(sql)執行語句,再用conn.commit()提交事務。

4.1、增加
#增加
sql='''INSERT INTO ''' + table_name + ''' (_id,name,price,weight) \
      VALUES (1, 'orange', 3.2,  100.5 )'''    
cursor.execute(sql)
sql='''INSERT INTO ''' + table_name + ''' (name,price,weight) \
      VALUES ('apple', 5.12,  80.2 )'''    
cursor.execute(sql) 
sql='''INSERT INTO ''' + table_name + ''' (name,price,weight) \
      VALUES ('pear', 2.12,  210 )'''    
cursor.execute(sql)         
conn.commit()
執行后可以看到寫入數據庫的內容:

因為定義了_id是自增變量(INTEGER PRIMARY KEY AUTOINCREMENT),在sql語句中也可以不必指定_id的值。這個時候需要注意如果指定了_id,再次insert同樣_id的記錄時,會導致拋異常:IntegrityError: UNIQUE constraint failed: table_juzicode._id。

4.2、查詢
sql = '''  SELECT _id, name, price, weight  from  ''' + table_name
values = cursor.execute(sql)
for v in values:
    print('----------------')
    print('_id   =',v[0])
    print('name  =',v[1])
    print('price =',v[2])
    print('weight=',v[3])
完整的代碼實現:

import  sqlite3

#檢查表是否存在,存在返回True
def check_table_exsist(cursor,table_name):
    sql = '''SELECT tbl_name FROM sqlite_master WHERE type = 'table' '''
    cursor.execute(sql)
    values = cursor.fetchall()
    tables = []
    for v in values:
        tables.append(v[0])
    print('數據庫包含的表:',tables) 
    if table_name in tables:
        return True
    return False
 
 
if __name__ == '__main__':        
    db_name = 'test.db'
    table_name = 'table_juzicode'

    #連接數據庫,創建游標
    conn = sqlite3.connect(db_name)
    cursor = conn.cursor()
    print(db_name +' 數據庫連接成功')

    #檢查表
    if check_table_exsist(cursor,table_name) is not True:
        print('表不存在:',table_name)
        sys.exit(-1)
        
    #查詢并顯示
    sql = '''  SELECT _id, name, price, weight  from  ''' + table_name
    values = cursor.execute(sql)
    for v in values:
        print('----------------')
        print('_id   =',v[0])
        print('name  =',v[1])
        print('price =',v[2])
        print('weight=',v[3])

    #關閉游標,關閉連接
    cursor.close()
    conn.close()
    print(db_name +' 數據庫關閉')
運行結果==========
 test.db 數據庫連接成功
 數據庫包含的表: ['table_juzicode', 'sqlite_sequence']
 _id   = 1
 name  = orange
 price = 3.2
 weight= 100.5
 _id   = 2
 name  = apple
 price = 5.12
 weight= 80.2
 _id   = 3
 name  = pear
 price = 2.12
 weight= 210.0
 test.db 數據庫關閉
4.3、刪除
print('刪除記錄......')
sql='''DELETE from ''' + table_name + '''  where _id=1'''    
cursor.execute(sql)
sql='''DELETE from ''' + table_name + '''  where _id=2'''    
ret = cursor.execute(sql)  
ret = conn.commit()
完整代碼實現:


import  sqlite3

#檢查表是否存在,存在返回True
def check_table_exsist(cursor,table_name):
    sql = '''SELECT tbl_name FROM sqlite_master WHERE type = 'table' '''
    cursor.execute(sql)
    values = cursor.fetchall()
    tables = []
    for v in values:
        tables.append(v[0])
    print('數據庫包含的表:',tables) 
    if table_name in tables:
        return True
    return False
    
#查詢、顯示
def query(cursor,table_name):
    sql = '''  SELECT _id, name, price, weight  from  ''' + table_name
    values = cursor.execute(sql)
    for v in values:
        print('----------------')
        print('_id   =',v[0])
        print('name  =',v[1])
        print('price =',v[2])
        print('weight=',v[3])
        
if __name__ == '__main__':    
    db_name = 'test.db'
    table_name = 'table_juzicode'

    #連接數據庫,創建游標
    conn = sqlite3.connect(db_name)
    cursor = conn.cursor()
    print(db_name +' 數據庫連接成功')

    #檢查表
    if check_table_exsist(cursor,table_name) is not True:
        print('表不存在:',table_name)
        sys.exit(-1)
     
    query(cursor,table_name)

    #刪除
    print('刪除記錄后......')
    sql='''DELETE from ''' + table_name + '''  where _id=1'''    
    cursor.execute(sql)
    sql='''DELETE from ''' + table_name + '''  where _id=2'''    
    ret = cursor.execute(sql)  
    ret = conn.commit()

    query(cursor,table_name)

    #關閉游標,關閉連接
    cursor.close()
    conn.close()
運行結果==========
 test.db 數據庫連接成功
 數據庫包含的表: ['table_juzicode', 'sqlite_sequence']
 _id   = 1
 name  = orange
 price = 3.2
 weight= 100.5
 _id   = 2
 name  = apple
 price = 5.12
 weight= 80.2
 _id   = 3
 name  = pear
 price = 2.12
 weight= 210.0
 刪除記錄后……
 _id   = 3
 name  = pear
 price = 2.12
 weight= 210.0
4.4、修改
#更新
sql = ''' UPDATE ''' + table_name + ''' set price = 1.55  where _id=1'''    
cursor.execute(sql)
sql = ''' UPDATE ''' + table_name + ''' set price = 2.55  where _id=5'''    
cursor.execute(sql)
ret = conn.commit()
完整代碼實現:

import  sqlite3

#檢查表是否存在,存在返回True
def check_table_exsist(cursor,table_name):
    sql = '''SELECT tbl_name FROM sqlite_master WHERE type = 'table' '''
    cursor.execute(sql)
    values = cursor.fetchall()
    tables = []
    for v in values:
        tables.append(v[0])
    print('數據庫包含的表:',tables) 
    if table_name in tables:
        return True
    return False
    
#查詢、顯示
def query(cursor,table_name):
    sql = '''  SELECT _id, name, price, weight  from  ''' + table_name
    values = cursor.execute(sql)
    for v in values:
        print('----------------')
        print('_id   =',v[0])
        print('name  =',v[1])
        print('price =',v[2])
        print('weight=',v[3])
        
if __name__ == '__main__':    
    db_name = 'test.db'
    table_name = 'table_juzicode'

    #連接數據庫,創建游標
    conn = sqlite3.connect(db_name)
    cursor = conn.cursor()
    print(db_name +' 數據庫連接成功')

    #檢查表
    if check_table_exsist(cursor,table_name) is not True:
        print('表不存在:',table_name)
        sys.exit(-1)
     
    query(cursor,table_name)

    #更新
    sql = ''' UPDATE ''' + table_name + ''' set price = 11.55  where _id=1'''    
    cursor.execute(sql)
    sql = ''' UPDATE ''' + table_name + ''' set price = 21.55  where _id=2'''    
    cursor.execute(sql)
    ret = conn.commit()

    print('更新后......')
    query(cursor,table_name)

    #關閉游標,關閉連接
    cursor.close()
    conn.close()
運行結果==========
test.db 數據庫連接成功
數據庫包含的表: ['table_juzicode', 'sqlite_sequence']
----------------
_id   = 1
name  = orange
price = 3.2
weight= 100.5
----------------
_id   = 2
name  = apple
price = 5.12
weight= 80.2
----------------
_id   = 3
name  = pear
price = 2.12
weight= 210.0
更新后......
----------------
_id   = 1
name  = orange
price = 11.55  #####發生了變化 
weight= 100.5
----------------
_id   = 2
name  = apple
price = 22.55  #####發生了變化
weight= 80.2
----------------
_id   = 3
name  = pear
price = 2.12

weight= 210.0

以上就是Python進階~sqlite3數據庫教程的詳細內容,想要了解更多Python教程歡迎持續關注編程學習網。

掃碼二維碼 獲取免費視頻學習資料

Python編程學習

查 看2022高級編程視頻教程免費獲取