網站首頁 編程語言 正文
前言
提到數據庫,大家第一時間想到的可能是 sql 數據庫,這種數據庫非常好用,但是對于新手就不是很容易上手,需要熟悉一段時間才可以大概掌握。這種數據庫在大型的項目開發過程中用到的地方不會很多,但是一些普通的項目還是很實用的,大大減少了代碼量。
sqlite3數據庫
sqlite3 數據庫是 Python 自帶的數據庫,甚至不需要額外安裝模塊,而且操作簡單。
Python + Mysql = SQLite
但是這種數據庫在網上的教程很少,因為我也是最近才知道,所以找了很長時間的資料,
今天終于找齊了,來總結一下。真的找了好長時間啊
1.需要的模塊(只有一個)
import sqlite3
2.模塊的使用
首先打開我們的編譯器(推薦使用vscode,因為數據庫文件后綴是 .db,vscode里顯示比較清楚)
2.1創建與數據庫的連接
先放上代碼
conn = sqlite3.connect('test.db')
使用 sqlite3 的 connect 函數可以創建數據庫或者連接數據庫,
如果這個數據庫存在,就連接這個數據庫,
如果這個庫不存在,就創建數據庫。
右邊小括號里的是數據庫名。
我們把這個保存在變量 conn 里,這個變量名可以自己起
公式:
變量名 = sqlite3.connect( '你要的數據庫名.db' )
2.2創建游標
還是先放代碼
cur = conn.cursor()
在 2.1 中,我們創建了與數據庫的連接,我們現在還需要一個游標來執行 sql 命令,
所以我們要用 conn 的 cursor 函數創建一個游標。
conn 就是剛才 2.1 中創建的保存數據庫的變量,你要用你定義的變量名,
再定義一個變量表示這個游標。
公式:
變量 = 數據庫變量.cursor()
2.3創建 table
先放代碼
import sqlite3
def check(db_name,table_name):
conn = sqlite3.connect(db_name)
cursor = conn.cursor()
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])
if table_name not in tables:
return False # 可以建表
else:
return True # 不能建表
conn = sqlite3.connect('數據庫名.db')
#創建一個游標 cursor
cur = conn.cursor()
if (check("數據庫名.db","Table名") == False):
sql_text_1 = '''CREATE TABLE 你的table名
(xx XX,
xx XX);'''
# 執行sql語句
cur.execute(sql_text_1)
代碼比較長,因為我把 2.1 和 2.2 的兩行代碼也加了上去。
我們需要 table(表)來存數據,創建 table 的代碼如下:
變量名 = '''CREATE TABLE 你的table名
(xx XX,
xx XX);'''
# 執行sql語句
cur.execute(上面的變量名)
上面是用一個變量保存了創建 table 的 sql 語句,
下面使用 cur(就是剛才那個游標).execute() 函數執行創建 table 的語句。
我們也可以使用 cur.executemany 函數來同時執行多條 sql 語句。
sql 語句的內容,比如創建表的格式是上面這樣的
格式:' ' 'CREATE TABLE 你的 table 名 (xx XX, xx XX);' ' '
?這行代碼里小寫的 xx 就是你要的屬性名,比如你的數據庫是這樣
姓名 | 班級 |
張三 | 1 |
其中,屬性名就是 “姓名” 和 “班級”,
小寫的 xx 就應該分別寫姓名和班級(注意,不帶引號)
后面的大寫的XX就是這個屬性所接受的數據的類型,
就相當于Python中的 int 類型和 str 類型。
只不過,我們在 sql 語句中,把 int 類型改成了 NUMBER,把 str 類型改成了 TEXT。
當我們運行這個代碼,我們的文件夾目錄里會多出來一個 你的數據庫名.db 文件
當我們再次運行,會發現程序報錯了。
報錯信息的大概意思是:table 已經存在了。
這是因為我們第一次運行時已經創建了 table ,我們再次運行時,
程序會再次創建同名 table,就會報錯。
所以,我們創建 table 之前要判斷一下這個table存不存在,如果存在就不創建,如果不存在就創建
這個判斷我把它寫成了一個函數,就是我上面代碼那個 check 函數。
這一步也是我想了好長時間,還找資料找了好長時間才知道的
2.4插入數據
先放代碼
cur.executemany('INSERT INTO 你的table名 VALUES (?,?)', data)
conn.commit()
其中第一行代碼中 executemany() 函數的意思就是同時執行多個 sql 語句。
這個函數的括號里寫的逗號前面就是插入數據的 sql 語句,后面 data 可以是一個列表或者元組。注意,如果是列表的話,必須是列表里面有若干個元組的形式。
插入數據的 sql 語句的使用:
INSERT INTO 你的table名 VALUES (若干個逗號,用逗號分割)
這里我們要插入 data 這些數據,所以在括號里我們使用問號 “?” 來代替這個元素。
大家可以回去看一下 2.3 創建table 的講解,在2.3中,我們創建了兩個屬性,分別是 “姓名” 和 “班級”。因為我們有兩個屬性,所以要有兩個問號。
2.5查找數據
先放代碼
def find_tb():
cur.execute("select * from 你的table名")
# 提取查詢到的數據
return cur.fetchall()
這個就很簡單了,我寫這個函數使用時可以把你那個table里的所有數據都取出來。
第一行是查找table的 sql 語句,格式是:
select * from 你的table名
下一行再用 fetchall() 函數把數據提取出來,直接 return 即可。
快樂的coding時間!
好了,前面的東西大家應該也都看完了,來點 demo ?
順便說一下,我這個 demo 的靈感來源是最近在網上刷到很多高考查分的視頻,恰好最近在做這個數據庫,所以說我這個 demo 受考試的啟發,就做了一個學生分數系統,其實這個特別爽,可以把自己的分數改成全部滿分!雖然實際沒啥用,但是還是很爽的
代碼里沒有我沒講過的部分,大家可以對照上面的講解看代碼,VScode無報錯運行。
對了,如果有看不懂的可以私信我,不出意外的話一天之內就能回復。
代碼:
import sqlite3
import os
def check(db_name,table_name):
conn = sqlite3.connect(db_name)
cursor = conn.cursor()
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])
if table_name not in tables:
return False # 可以建表
else:
return True # 不能建表
def find_tb():
cur.execute("select * from scores")
# 提取查詢到的數據
return cur.fetchall()
def zcd():
os.system('cls')
print("學生分數管理系統")
print("1.增加學生分數信息")
print("2.查看全部學生分數")
print("3.查詢分數段內學生分數")
print("4.退出")
if __name__ == '__main__':
# 創建與數據庫的連接
conn = sqlite3.connect('stuents_scores.db')
#創建一個游標 cursor
cur = conn.cursor()
# 如果沒有表則執行建表的sql語句
if (check("stuents_scores.db","scores") == False):
sql_text_1 = '''CREATE TABLE scores
(姓名 TEXT,
班級 TEXT,
性別 TEXT,
語文 NUMBER,
數學 NUMBER,
英語 NUMBER,
總分 NUMBER);'''
# 執行sql語句
cur.execute(sql_text_1)
zcd()
while True:
op = int(input("請輸入:"))
if op == 1:
S_name = input("請輸入要添加的學生的姓名(如:張三):")
S_class = input("請輸入要添加的學生的班級(如:一班):")
S_xb = input("請輸入該學生性別:")
S_Chinese = int(input("請輸入該學生語文成績(只輸入一個數字,如:82):"))
S_Maths = int(input("請輸入該學生數學成績(只輸入一個數字,如:95):"))
S_English = int(input("請輸入該學生英語成績(只輸入一個數字,如:98):"))
S_gj = S_Maths+S_Chinese+S_English # 總分
data = [(S_name, S_class, S_xb, S_Chinese, S_Maths, S_English,S_gj)]
cur.executemany('INSERT INTO scores VALUES (?,?,?,?,?,?,?)', data)
conn.commit()
# cur.close()
# conn.close()
print("成功!")
os.system('pause')
os.system('cls')
zcd()
elif op == 2:
info_list = find_tb()
print("全部學生信息(排名不分前后):")
for i in range(len(info_list)):
print("第"+str(i+1)+"個:")
print("學生姓名:"+str(info_list[i][0]))
print("學生班級:"+str(info_list[i][1]))
print("學生性別:"+str(info_list[i][2]))
print("學生語文成績:"+str(info_list[i][3]))
print("學生數學成績:"+str(info_list[i][4]))
print("學生英語成績:"+str(info_list[i][5]))
print("學生總成績:"+str(info_list[i][6]))
os.system('pause')
os.system('cls')
zcd()
elif op == 3:
info_list = find_tb()
fen = int(input("你要要查詢總成績高于n分的學生, 請輸入n:"))
for i in range(len(info_list)):
if info_list[i][6] >= fen:
print("查詢結果:")
print("第"+str(i+1)+"個:")
print("學生總成績:"+str(info_list[i][6]))
os.system('pause')
os.system('cls')
zcd()
elif op == 4:
os.system('cls')
break
最后
原文鏈接:https://blog.csdn.net/m0_64036070/article/details/125462997
相關推薦
- 2022-03-16 C語言下快速排序(挖坑法)詳解_C 語言
- 2023-01-15 mvn?打包報錯:no?compiler?is?provided?in?this?environme
- 2022-12-03 C?++迭代器iterator在string中使用方法介紹_C 語言
- 2022-05-31 k8s部署Ingress并創建規則的詳細介紹_云其它
- 2022-04-22 npm WARN postcss-modules@4.2.2 requires a peer of
- 2022-07-07 C++如何將二叉搜索樹轉換成雙向循環鏈表(雙指針或數組)_C 語言
- 2022-09-04 react?表單數據形式配置化設計_React
- 2022-09-16 selenium.chrome寫擴展攔截或轉發請求功能_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支