當前位置:首頁 ? tkinter ? 正文

tkinter之SQLite操作

這篇文章我來講一下python內置的數據庫sqlite3,這本是python知識,我們先是溫習一下sqlite3知識,然后結果上一篇文章講解的treeview組件或別的組件來顯示數據庫的增,查,改,刪等操作結果。

先復習sqlite數據庫知識。

1. 創建數據庫文件

2. 操作SQLite: 增加記錄,查看記錄,修改記錄,刪除記錄

 

對于SQLite操作的步驟:

1. 導入sqlite3模塊

2. 創建Connection連接對象

3. 創建Cursor游標對象

4. 執行SQL語句,操作數據庫的增,查,改,刪等操作

5. 關閉游標對象

6. 增,查,改,刪操作要提交事務

7. 關閉連接對象

 

好,先來創建一個數據庫test1.db,并新建一個表user,表里有設2個字段:id,name,id設為主鍵,id字段屬性為整型,占10個字節,name字段為字符型,占20個字節。下面的代碼實現了以上功能:

 

創建數據庫及創建一個數據表user

import sqlite3  # 導入sqlite3模塊
 
# 創建連接對象
conn=sqlite3.connect('test1.db') #創建或打開數據庫
 
# 創建游標對象
cur=conn.cursor() # 創建游標對象
 
# SQL語句
cur.execute('create table user (id int(10) primary key, name varchar(20))') 
# 創建表:user,2個字段:id,name,id為主鍵
 
# 關閉游標對象
cur.close()
 
# 提交事務
# --- 數據庫的增,改,刪要提交事務
 
# 關閉連接對象
conn.close()


運行后,就在你的代碼目錄里生成test1.db , 里面有一個表user,大家可以用Navicat for SQLite 等相關軟件查看這個數據庫里的user表是否生成。

 

如果你再次運行上面的代碼,會出錯,因為user表已經生成,不能再生成了。

好,我就在這個表的基礎上,進行增加,查找,修改,刪除的操作。

 

先增加幾條記錄,增加記錄,也是操作SQL操作。操作數據庫的步驟就像我前面說的幾個步驟。

下面的代碼會增加一條記錄:1,‘劉一’

 

數據表增加一條記錄:

import sqlite3  # 導入sqlite3模塊
 
# 創建連接對象
conn=sqlite3.connect('test1.db') #創建或打開數據庫
 
# 創建游標對象
cur=conn.cursor() # 創建游標對象
 
# SQL語句  # 源碼來自wb98.com
# cur.execute("insert into user (id,name) values (1,'劉一')")
# 為了sql注入,不推薦上面這種方式
cur.execute('insert into user (id,name) values (?,?)',(1,'劉一'))
# 表user增加一條記錄
 
# 關閉游標對象
cur.close()
 
# 提交事務
conn.commit() # 提交事務
# --- 數據庫的增,改,刪要提交事務
 
# 關閉連接對象
conn.close()


運行后,user表會增加一條記錄。

注意,在sql語句中,為了防止sql注入風險,采用采用占用符的方式。

 

以上采用的是游標對象的execute方法新增一條記錄,下代碼采用executemany() 一次就新增幾條記錄,只要稍稍改動上面的代碼就行了?!   ∝钾~

 

數據表記錄批量增加:

import sqlite3  # 導入sqlite3模塊
 
# 創建連接對象
conn=sqlite3.connect('test1.db') #創建或打開數據庫
 
# 創建游標對象
cur=conn.cursor() # 創建游標對象
 
# SQL語句
newlist=[(2,'陳二'),(3,'張三'),(4,'李四'),(5,'王五'),(6,'趙六'),
   (7,'孫七'),(8,'周八'),(9,'吳九'),(10,'鄭十')]
cur.executemany('insert into user (id,name) values (?,?)',newlist)
# 表user批量增加幾條記錄
 
# 關閉游標對象
cur.close()
 
# 提交事務
conn.commit() # 提交事務
# --- 數據庫的增,改,刪要提交事務
 
# 關閉連接對象
conn.close()

以上代碼,我在win10,python3.8版測試成功,Navicat for SQLite都可以打開數據庫查看證實成功,但是我們現在要自己寫代碼輸出這個數據庫的內容。

  

數據表中的記錄查看:

游標對象有幾個方法跟記錄查看有關,我們來學習或回顧一下:

方法

說明

fetchone()

獲取查詢結果集中的下一行,返回一個單一的序列,當沒有數據時,返回 None

fetchmany(size)

獲取查詢結果集中的下一行組,返回一個列表。當沒有更多的可用的行時,則返回一個空的列表。

fetchall()

獲取查詢結果集中所有(剩余)的行,返回一個列表。當沒有可用的行時,則返回一個空的列表

 

下面的代碼演示了上述3個方法:

import sqlite3  # 導入sqlite3模塊
 
# 創建連接對象
conn=sqlite3.connect('test1.db') #創建或打開數據庫
 
# 創建游標對象
cur=conn.cursor() # 創建游標對象
 
# SQL語句
cur.execute('select * from user where id=?',(1,)) #  查詢第一條記錄
result1=cur.fetchone() # 獲取一條查詢記錄
print('第1條記錄:',result1)
print('-----')
 
cur.execute('select * from user where id between ? and ?',(1,5)) # 查詢id值范圍為1-5之間的記錄
result2=cur.fetchmany(5) # 獲取5條查詢記錄
print('id=1至5的記錄:',result2)
print('-----')
 
cur.execute('select * from user') # 查詢所有記錄
result3=cur.fetchall() # 獲取所有的查詢記錄
print('所有的記錄:',result3)
print('-----')
 
# 關閉游標對象
cur.close()
 
# 提交事務
conn.commit() # 提交事務
# --- 數據庫的增,改,刪要提交事務
 
# 關閉連接對象
conn.close()

運行代碼,輸出:

第1條記錄: (1, '劉一')

-----

id=1至5的記錄: [(1, '劉一'), (2, '陳二'), (3, '張三'), (4, '李四'), (5, '王五')]

-----

所有的記錄: [(3, '張三'), (4, '李四'), (5, '王五'), (6, '趙六'), (7, '孫七'), (8, '周八'), (9, '吳九'), (10, '鄭十')]

-----

 

數據庫的記錄修改:

數據表中的記錄修改,我們也是通過execute()方法來操作sql語句來達成目的。下面的代碼來演示一下,把第一條記錄的name改成“曹操”。

import sqlite3  # 導入sqlite3模塊
 
# 創建連接對象
conn=sqlite3.connect('test1.db') #創建或打開數據庫
 
# 創建游標對象
cur=conn.cursor() # 創建游標對象
 
# SQL語句
cur.execute('update user set name=? where id=?',('曹操','1'))
# 修改id=1的記錄 name='曹操'
 
# 關閉游標對象
cur.close()
 
# 提交事務
conn.commit() # 提交事務
# --- 數據庫的增,改,刪要提交事務
 
# 關閉連接對象
conn.close()


 數據表中的記錄刪除:

記錄的刪除,當然也是通過execute()方法來操作sql語句來達成目的。只要把上面的SQL語句改一下就行,其它都不用改變。

import sqlite3  # 導入sqlite3模塊
 
# 創建連接對象
conn=sqlite3.connect('test1.db') #創建或打開數據庫
 
# 創建游標對象
cur=conn.cursor() # 創建游標對象
 
# SQL語句
cur.execute('delete from user where id=?',(10,))
# 刪除id=10的記錄
 
# 關閉游標對象
cur.close()
 
# 提交事務
conn.commit() # 提交事務
# --- 數據庫的增,改,刪要提交事務
 
# 關閉連接對象
conn.close()

小醒一下:數據庫的記錄的增加,修改,刪除要提交事務才可以更新成功。   丶丌皛

 

       上面是對SQLite3操作的基本知識的學習或回顧,下面我們要利用tkinter學習的組件知識來顯示對數據庫的操作結果。

Treeview組件用來顯示數據表是非常合適的,下面就來講一下如何顯示數據表中的記錄。

  

下面代碼,是在上面的代碼基礎上,再加入創建一個treeview組件,用循環的方法,將fetchall() 返回的所有記錄列表中的元素,一一插入到treeview組件里。這個難度并不大。

from tkinter import *
from tkinter.ttk import *
import sqlite3 # 導入sqlite3模塊
 
root=Tk() # 源碼來自wb98.com
 
# 創建連接對象
conn=sqlite3.connect('test1.db') #創建或打開數據庫
 
# 創建游標對象
cur=conn.cursor() # 創建游標對象
 
# SQL語句
cur.execute('select * from user')
result=cur.fetchall() # 返回所有記錄列表
 
# 關閉游標對象
cur.close()
 
# 提交事務
# --- 只是查詢,不用提交事務
 
# 關閉連接對象
conn.close()
 
tree1=Treeview(root,columns=('c1','c2'),show='headings') # 創建無圖標欄的單列表欄
tree1.column('#1',width=80,anchor=CENTER) # 設置組件標題欄寬度,列對齊方式
tree1.column('#2',width=80,anchor=CENTER)
tree1.heading('c1',text='ID') # 設置組件標題欄文本
tree1.heading('c2',text='姓名')
 
for i in result: # 循環把列表元素一一加入tree1組件
    tree1.insert('',index=END,values=i)
 
tree1.pack()
 
root.mainloop()

運行結果

             1.PNG

  

上面的數據庫稍簡單一點,不好演示SQL語句,我用代碼,由一個文本導入到數據庫。

先在test1.db這個數據庫,再新建一個表student,然后用行方法讀取文本db.txt,把一行作為一行記錄讀取到student表中。

下面是db.txt的內容:

1,a,3,李明,88,79,67,

2,b,5,王小梅,56,99,87,

3,a,2,陳小明,68,77,56,

4,b,6,張梅芳,74,86,76,

5,a,10,鄭明,66,68,100,

6,b,8,何振華,77,87,91,

7,a,11,吳小芳,97,72,67,

8,b,1,姚明,68,77,87,

9,a,12,孫文正,89,81,73,

10,b,4,陳生國,50,86,93,

11,a,1,何云峰,88,99,96,

12,a,13,李強民,77,49,89,

13,a,4,明正,72,89,67,

14,b,3,曾紅梅,48,55,86,

15,a,8,吳小京,82,67,69,

16,a,6,黃杰倫,75,74,96,

17,b,9,周春雨,95,65,99,

18,b,10,胡歌,91,99,67,

19,a,5,何英杰,89,85,91,

20,b,7,孫娜娜,79,83,99,

21,b,11,陳清鋒,89,94,88,

22,a,9,李強,68,69,66,

23,b,2,何雨琴,67,93,67,

24,b,12,陳克民,98,67,56,

25,a,7,楊明明,46,100,87,

26,b,13,周玉琴,75,45,88,

 

 以下是新建數據表 student 的代碼

import sqlite3  # 導入sqlite3模塊
 
# 創建連接對象
conn=sqlite3.connect('test1.db') #創建或打開數據庫
 
# 創建游標對象
cur=conn.cursor() # 創建游標對象
 
# SQL語句
cur.execute('''create table student (
   id INTEGER(10) primary key, 
   bj TEXT(10),
   xh TEXT(10),
   xm TEXT(10),
   yw REAL(10),
   sx REAL(10),
   yy REAL(10)
   )''') 
# 創建表student: id  bj班級 xh學號 xm姓名 yw語文 sx數學 yy英語
 
# 關閉游標對象
cur.close()
 
# 提交事務
# --- 數據庫的增,改,刪要提交事務
 
# 關閉連接對象
conn.close()

 

寫代碼把db.txt的文本導入到數據表student中

import sqlite3  # 導入sqlite3模塊
 
with open('db.txt', 'r', encoding='utf-8') as file:  # 只讀方式打開編碼為utf-8的文本文件
    line = file.readlines()  # 以讀取一行為列表方法讀取全部行,line為分解好的列表內容
 
# str1[0]:id  str1[1]:bj班級  str1[2]:xh學號  str1[3]:xm姓名  str1[4]:yw語文
# str1[5]:sx數學  str1[6]:yy英語
 
# 創建連接對象
conn=sqlite3.connect('test1.db') #創建或打開數據庫
 
# 創建游標對象
cur=conn.cursor() # 創建游標對象
 
for i in range(len(line)): # 以循環方法把讀取的每一行插入到數據表的記錄中
    str1 = line[i].split(',')  # 讀取新一行記錄
    cur.execute('insert into student (id,bj,xh,xm,yw,sx,yy) values (?,?,?,?,?,?,?)',str1)
 
# 關閉游標對象
cur.close()
 
# 提交事務
conn.commit() # 提交事務
# --- 數據庫的增,改,刪要提交事務
 
# 關閉連接對象
conn.close()

 

運行后,用Navicat for SQLite 查看test1中數據表student的結果

2.PNG

 

我就用這個數據表的數據來演示,用treeview等組件來顯示數據,并順便溫習一下SQL語句知識。

以下是全部代碼:

from tkinter import *
from tkinter.ttk import *
import sqlite3 # 導入sqlite3模塊
 
def selectjob(strSQL):
    # 創建連接對象
    conn=sqlite3.connect('test1.db') # 創建或打開數據庫
 
    # 創建游標對象
    cur=conn.cursor() # 創建游標對象
 
    for i in tree1.get_children(): # 清空treeview所有記錄
        tree1.delete(i)
 
    # SQL語句
    cur.execute(strSQL)
 
    result=cur.fetchall() # 返回所有記錄列表
 
    root.title(str(len(result))+"條記錄")
 
    for i in result: # 循環把列表元素一一加入tree1組件
        tree1.insert('',index=END,values=i)
 
    # 關閉游標對象
    cur.close()
 
    # 提交事務
    # --- 只是查詢,不用提交事務
 
    # 關閉連接對象
    conn.close()
 
root=Tk()
 
tree1=Treeview(root,columns=('c1','c2','c3','c4','c5','c6','c7'),show='headings') # 創建無圖標欄的單列表欄
tree1.column('#1',width=40) # 設置組件標題欄寬度,列對齊方式
tree1.column('#2',width=40)
tree1.column('#3',width=40)
tree1.column('#4',width=80)
tree1.column('#5',width=80)
tree1.column('#6',width=80)
tree1.column('#7',width=80)
 
tree1.heading('c1',text='ID') # 設置組件標題欄文本
tree1.heading('c2',text='班級')
tree1.heading('c3',text='學號')
tree1.heading('c4',text='姓名')
tree1.heading('c5',text='語文')
tree1.heading('c6',text='數學')
tree1.heading('c7',text='英文')
 
root.rowconfigure(0,weight=1) # 某行 限制最小高度為30像素
root.columnconfigure(0,weight=1) # 某列 限制最小寬度為66像素
root.columnconfigure(1,weight=1) # 某列 限制最小寬度為66像素
root.columnconfigure(2,weight=1) # 某列 限制最小寬度為66像素
 
tree1.grid(row=0,column=0,columnspan=3,sticky=NSEW)
 
scr1=Scrollbar(root)  # 垂直滾動條
scr1.grid(row=0,column=3,sticky=N+S)
 
tree1.config(yscrollcommand = scr1.set) # Treeview和滾動條互相綁定
scr1.config(command = tree1.yview)
 
var=StringVar()
list1=('顯示所有同學',
       '只顯示a班同學',
       '姓名含“明”字的同學',
       '姓名第2個字是“明”的同學',
       '二字姓名,第2個字是“明”的同學',
       '3門功課有一門為100分的同學',
       '3門功課都不及格的同學',
       '學號為1,5,7,8的同學',
       '三門功課平均分>=90分的同學',
       'a班按語文成績降序排列,輔之以數學降序,英文升序排列',
       '名字不包含“雨”字的同學',
       '語文分數在90到100之間高分同學',
       '語文分數在60到90分范圍以外的高分和低分同學,降序排列',
       '姓名第2字和第3字相同的姓名',
       '顯示姓“鄭,何,周”的同學',
       '顯示本文章的作者的姓名:何云峰(wb98·com)',
       )
com1=Combobox(root,textvariable=var,value=list1,state='readonly')
com1.grid(row=1,column=0,columnspan=4,sticky=W+E)
com1.current(0)
 
def com1selection(event):
    # print('選擇后:',com1.get())
    print('選擇項序號:',com1.current())
    index=com1.current() # 選擇項序號
    if index==0: # 顯示所有同學
        stra='select * from student'
    elif index==1: # 只顯示a班同學
        stra='select * from student where bj="a"'
    elif index==2: # 姓名含“明”字的同學
        stra='select * from student where xm like "%明%"'
    elif index==3: # 姓名第2個字是“明”的同學
        stra='select * from student where xm like "_明%"'
    elif index==4: # 二字姓名,第2個字是“明”的同學
        stra='select * from student where xm like "_明"'
    elif index==5: # 3門功課有一門為100分的同學
        stra='select * from student where yw="100" or sx="100" or yy="100"'
    elif index==6: # 3門功課都不及格的同學
        stra='select * from student where yw<"60" and sx<"60" or yy<"60"'
    elif index==7: # 學號為1,5,7,8的同學
        stra='select * from student where xh in (1,5,7,8)'
    elif index==8: # 三門功課平均分>=90分的同學
        stra='select * from student where (yw+sx+yy)/3>=90'
    elif index==9: # a班按語文成績排序(降序),輔之以數學降序,英文升序排列
        stra='select * from student  where bj="a" order by yw desc,sx desc,yy asc'
    elif index==10: # 名字不包含“雨”字的同學
        stra='select * from student where xm not like "%雨%"'
    elif index==11: # 語文分數在90到100之間的同學
        stra='select * from student where yw between 90 and 100'
    elif index==12: # 語文分數在60到90分范圍以外的高分和低分同學,降序排列
        stra='select * from student where yw not between 60 and 90 order by yw'
    elif index==13: # 姓名第2字和第3字相同的姓名
        stra='select * from student where substr(xm,2,1)=substr(xm,3,1)'
    elif index==14: # 顯示姓“鄭,何,周”的同學
        stra=stra='select *  from student where substr(xm,1,1) in ("鄭","何","周")'
    elif index==15: # 顯示本文章的作者的姓名:何云峰(wb98·com)
        stra=stra='select *  from student where xm="何云峰"'
 
    selectjob(stra)
 
com1.bind("<<ComboboxSelected>>",com1selection)
 
root.mainloop()

運行結果


sqlite3數據表的記錄在treeview組件的顯示及sql語句知識,我就演示到這里。

包括這篇文章在內,我也寫的文章都是我學習tkinter編程知識的筆記,以后更多的是寫一些實際的小程序代碼,加深對知識的了解,鞏固學過的知識,你想跟我一起學習tkinter,ttk編程嗎?請關注我。收藏我的文章,謝謝。我的網站 wb98.com

 


來源:濟亨網

本文鏈接:http://www.chinaengraver.com/post/343.html

    << 上一篇 下一篇 >>

    湘公網安備 43011102000514號 - 湘ICP備08100508號

    2019年秋霞鲁丝片瓜皮_导航亚洲AV日韩AV永久无码_有没有哪些可以看片的免费的_国产色妞妞在线视频免费播放