1. 程式人生 > >Sqlit3資料庫的詳細講解及一些在python中的小技巧

Sqlit3資料庫的詳細講解及一些在python中的小技巧

資料庫的基本概念。

  1. 庫 schema:好像整個表格文件。好像一個物流公司共佔地100畝,蓋了50個倉庫,A01倉庫負責儲存河南客戶貨物,A02倉庫負責儲存廣州xx專案物料。每一個倉庫對應一個專案。
  2. 表 table:對應Excel表格裡sheet1 sheet2。由行內內容和列組成。表描述一個類,每一行描述一個物件。
  3. 欄位 field:對應表格頭部的 序號、班級、姓名。好像類的屬性。
  4. 值 value:表格每一行具體儲存的資訊。
  5. 主鍵 primary key:類似表格中 序號 這一列。資料庫中這一列會自增並不會重複。
  6. 外來鍵 foreign key:表1裡一個欄位引用另一個表的行。有點易於維護,保持資料一致性。

欄位型別 field type

資料庫建立表示要事先告訴計算機硬碟,每張表的每個欄位存什麼型別、將要儲存的內容大還是小。長度過小,內容值存不進去,長度太大,浪費硬碟空間。我們需要選擇合適的型別和長度。
各資料庫欄位型別關鍵字基本一致。mysql oracle postgresql常用欄位型別如下:

  1. 整數
    整數:常用INT INTEGER 佔4個位元組,2**32,可以表示常用範圍整數。
    (不常用)TINYINT(1位元組) SMALLINT(2位元組) MEDIUMINT(3位元組)
    BIGINT(8位元組) 適用身份證號、VIP號碼比較長的編號。
  2. 浮點數
    常用 FLOAT(4位元組) 單精度小數 。 即使是單精度,範圍也不小。
    DOUBLE(8位元組) 雙精度小數。
    場景 金錢計算,軌道計算。
  3. 字串
    CHAR char(10) 可以儲存長度(位元組長度)不超過10的字串。例如"hello"。但由於長度按照位元組判斷,存unicode編碼的中文只能存3個。
    常用 VARCHAR 0-65535位元組,variable char 可變字串。VARCHAR(5) 可以儲存5箇中文或5個英文字母。場景 使用者名稱、家庭住址。
    TEXT TINYTEXT medium longtext , 場景 大文字儲存,書籍文章、使用者反饋。
    BLOB medium longblob ,二進位制檔案, 場景 圖片、視訊。但一般不在資料庫中儲存圖片和視訊,因為會增加資料庫的計算壓力和頻寬傳輸壓力和備份還原的難度和使用者資訊靜態資源耦合到一起,解決方案是 圖片視訊存到普通檔案目錄下,資料庫中儲存檔案路徑。
  4. 日期
    DATE 日期, 形如"2018-11-08"
    常用 DATETIME 日期時間, “2018-11-08 16:52:30” “2018-11-08 16:52:30.123” “2018-11-08 16:52:30 GTM+8”
    常用 TIMESTAMP 時間戳, 1541667270 1541667270.7252207 1541667270725
  5. sqlite的欄位比較簡化:
    INTEGER 整數
    REAL 浮點數
    TEXT 字串
    NULL 什麼都不存

資料庫的在python中的簡單應用

sqlite 比較輕是python的內建庫 我們要使用只需要安裝一個驅動叫做JDBC就行具體步驟如下:

   1. pycharm左下角圖示調出工具欄,開啟pycharm右側Database工具。
   2. 點加號-DataSource資料來源-sqlite  。
   3. 彈出的對話方塊選擇 drivers-sqlite(Xerial)  
   4. 點選download sqlite-jdbc[latest]  
   5. 如果網速不好的話 下載sqlite-jdbc-3.20.1.jar 。對話方塊+-custom jars 從本地安裝
   6. 驅動安裝成功後點擊apply應用
   7. 點選對話方塊 project data source ,開始配置連線資料庫的例項
   8. File路徑點選 ...圖示,選擇要連線的.db檔案。
   9. 點test connection, seccessful為成功
   10. 點選ok退出。看到連線的資料庫例項下有表`

database 工具使用

展開目錄,找到 表。
schemas 模型,理解為大的倉庫,預設有一個倉庫main,main倉庫下是我們建的表。
sqlite_masters是資料庫系統內建表,不用關注它,不能刪除。
不用關注collations資料夾。
雙擊表查看錶資料。
圖形化介面 加減號增加修改資料,注意修改完需要submit提交。
點選console圖示,開啟sql命令列工具,可以在裡面寫sql語句,點選execute按鈕執行,得到結果集。
選中庫,右鍵new-table,視覺化介面建立表。
例項右鍵 database-tools - manage shown schema  
工具會自動提交。

SQL查詢語句

介紹: structured query language 結構化查詢語言。專門對資料庫進行查詢、增加、修改、刪除、統計的操作語言。
CURD 增刪查改 create update retrieve delete。
書寫風格,關鍵字大小寫都行,建議大寫。表名大小寫都行,但是在一些資料庫中不區分大小寫,建議小寫。

(重要)基本語法。


1. 查詢
SELECT 欄位1,欄位2,欄位3,...  FROM 表名;      python中返回值形如[(1, 502, 小明,), (), ()]。
欄位比較多時簡寫為  SELECT * FROM 表名;       由於資料庫執行時會把*轉換為欄位再執行,效能極微小下降。
SELECT * FROM 表名 WHERE 欄位1 = 過濾值,字典2=過濾值 ;       where限定條件查詢。
2. 新增 
INSERT 欄位1,欄位2,... INTO 表名 VALUES (1, "小明", "男");
簡寫 INSERT INTO 表名 VALUES (1, "小明", "男");
3. 修改
UPDATE 表名 SET 欄位1=新值,欄位2=新值 WHERE 欄位1 = 過濾值;
注意沒有where條件限定行的話將會更新整張表。
4. 刪除
DELETE FROM 表名;                 注意會刪除整張表。
DELETE FROM 表名 WHERE 欄位1 = 過濾值;       限定條件刪除某些行。
# 假性刪除,為了防止資料誤刪和方便找回。專門新建一個標識欄位來表示使用者狀態(正常、登出)
cursor.execute("""
    UPDATE employee set address=1 where id>4 ;
""")


5. 建立表
CREATE TABLE 表名 {
    欄位型別 欄位名 其它關鍵字(主鍵 備註),
    INT   id   PRIMARY KEY,
    VARCHAR(20) username ,
}

程式碼例項

建立表,插入資料

# sqlite 建立表,插入資料
import sqlite3
connect = sqlite3.connect("testsqlite.db")  # 連線資料庫
cursor = connect.cursor()  # 開啟遊標
cursor.execute("""CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(10)); """)  # 建立表
cursor.execute("""
    INSERT INTO student (id, name) VALUES (4, "明");
""")  # 插入資料
cursor.close()  # 關閉遊標 可以省略
connect.commit()  # 提交事務
connect.close()  # 關閉資料庫連線

"""
(瞭解)資料庫驅動:資料庫有自己本身的軟體構造和操作語言,資料庫暴露出操作介面,方便跟其它各種程式語言對接。程式語言到資料庫的對接中介 叫驅動。所以我們用python操作資料庫要使用驅動。
步驟:
1. 引入驅動包
2. 連線資料庫,得到會話。   中大型資料庫需要先使用者名稱、密碼驗證,再建立資料庫,再連線資料庫;而輕量級的sqlite省略了前面的過程直接連線,如果這個資料庫不存在的話,會新生成一個庫,資料儲存在一個單db檔案中。
3. 生成遊標。  遊標:遊標是對資料庫某一行某一格進行增刪改查的操作者,就好像操作excel表格時的滑鼠。
4. 執行SQL語句,cursor,execute()執行語句,引數是字元SQL語句。
5. 執行完成後關閉遊標。   這一步可以省略。
6. 提交 commit。   除了查詢,增加、修改、刪除操作都需要在執行sql提交,否則不生效,好像平時用軟體儲存時的確認對話方塊。
7. 斷開會話連線,釋放資源。
"""

"""
可能的異常:
1. 唯一約束錯誤,主鍵重複。 sqlite3.IntegrityError: UNIQUE constraint failed: student.id
2. 表已存在重複建立。sqlite3.OperationalError: table student already exists
"""

查詢 修改 刪除

# sqlite  查詢 修改 刪除
import sqlite3
connect = sqlite3.connect("testsqlite.db")
cursor = connect.cursor()
cursor.execute("""
    SELECT id,name from student;
""")
student_list = cursor.fetchall()
print(student_list)

cursor.execute("""
    SELECT * FROM student WHERE name="小明"; 
""")
student = cursor.fetchone()
print(student)

cursor.execute("""
    SELECT * FROM student WHERE id=0;
""")
student2 = cursor.fetchone()
print(student2)

cursor.execute("""
    SELECT * FROM student WHERE id>0;
""")
# student_list3 = cursor.fetchall()
student3 = cursor.fetchone()
# print(student_list3)
print(f'學生姓名是 {student3[1]}')
# print('學生姓名是{} 性別{} 住址{} 電話{}'.format(student3['name'], student3[2], ))

cursor.execute("""
    UPDATE student SET name="大紅" WHERE id=3;
""")
connect.commit()
cursor.execute(""" select * from student; """)
print(cursor.fetchall())

cursor.close()
connect.close()

"""
cursor 取資料
cursor.fetchall()  取回結果集,形如[(1, '小王'), (2, '小明')] 大列表,列表每一項是元組、是一行,元組裡的每一項對應每一列的值。結果空返回[]。
cursor.fetchone()  取回一條資料,形如 (2, '小明') 。結果空返回None型別。如果select符合多條,返回多條結果裡的第一條。
cursor.fetchxxx() 方法為了節省記憶體和速度採用了生成器結構,只能取一次。
"""
"""
sql基礎語法補充:
1. 一張表一般都有一列主鍵,主鍵primary key一般名叫 id,欄位型別一般為自增整數。當insert行內容時,sql語句可以不插入id列,資料庫會幫你自動插入並自增auto increase。
主鍵不能重複。主鍵好處是確保資料一致性、方便查詢。
2.如果工作中一個數據庫連線例項下有多個庫,那麼表名要帶上名稱空間,例如main.student。
3.丟棄表 drop。跟delete關鍵字相比更為嚴重,delete刪除某行或清空表內容 表結構還在。而drop是完全刪除丟棄整個表,內容和結構都刪除。 drop table [表名]。
4.欄位被雙引號括住 ,形如SELECT "id", "name" FROM student; ,結果一樣。好處是避免資料庫關鍵字導致的錯誤。當資料庫直譯器遇到引號時,會認為引號裡的名字就是使用者自定義的欄位名而不是內建關鍵字。平時省事可以不加引號。

"""

關於 cursor.fetchall() 方法返回值為字典形式

點選 傳送門 傳送。