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
掃碼二維碼 獲取免費視頻學習資料
- 本文固定鏈接: http://www.stbrigidsathleticclub.com/post/11317/
- 轉載請注明:轉載必須在正文中標注并保留原文鏈接
- 掃碼: 掃上方二維碼獲取免費視頻資料
查 看2022高級編程視頻教程免費獲取