python自带的数据库_Python小白的数据库入门
前言
SQL數據庫數據庫SQL語言入門SQL簡介SQL 的作用
SQL語句分類
SQLite 數據庫SQLite 中的數據類型
DDL語句創建表
刪除表
修改表
DML語句添加
刪除
修改
查詢
Python中的SQLite操作SQLite游標對象
Sqlite防注入
數據庫可視化
歸納總結
前言可以毫不夸張的說,不懂數據庫,不是真正的程序員。紛繁復雜,界面絢麗的程序,最本質的無非都是在操作數據而已。既然有數據,那就肯定需要一個東西去存放并管理這些數據,而數據庫就是這么一個軟件。
有些人可能沒有直接接觸過數據庫,但我相信大部分人都用過Excel這種表格工具。實際上,它就相當于一個簡單的數據庫,與之相比,更貼切的可能是 Access數據庫。
在學習數據庫之前,我們先看看數據庫到底長什么樣子,得先有感性認識才行
這是MySql數據庫
MySQL
這是Sqlite3數據庫
sqlite3
以上兩個是主流的關系型數據庫,我們觀察之后發現,它們與我們熟知的Excel好像也沒有什么不同。關系型數據庫里面放的都是一張張的表,就如同Excel中的工作簿。就算不熟悉Excel,但每一張表也都是我們從小到大所熟悉的那種表結構,例如課程表、值日表之類的。
與Excel不同的是,數據庫提供了快速的、高效的編程接口,可以讓我們非常簡潔、靈活的以代碼去操作這個數據庫,例如刪除一條數據、新增一條數據、對數據進行排序,就想我們經常對價格、銷量、好評排序那樣。這些都是Excel無法比擬的。
SQL數據庫所謂數據庫,即存儲數據的倉庫。每一個數據庫可以存放若干個數據表,這里的數據表就是我們通常所說的二維表,分為行和列,每一行稱為一條記錄,每一列稱為一個字段。表中的列是固定的,可變的是行。要注意,我們通常需要在列中指定數據的類型,在行中添加數據,即我們每次添加一條記錄,就添加一行,而不是添加一列。對數據庫的操作可以概括為就是向數據庫中添加、刪除、修改和查詢數據,其中查詢功能最為復雜。
先簡單了解了一下數據庫,接下來學習一下數據庫相關的概念。
數據庫SQL語言入門
SQL簡介結構化查詢語言(Structured Query Language)簡稱SQL,是一種特殊目的的編程語言,是一種數據庫查詢和設計語言,用于存取數據以及查詢、更新和管理關系數據庫系統.
簡而言之,SQL就是一種腳本編程語言,是絕大多數數據庫的通用語言。沒錯,剛學會Python,接下來又得學習新的語言……不過,對于非DBD(Database Desktop,數據庫維護人員)的開發人員而言,并不需要對SQL語言掌握得太深入,SQL的基本用法實際上是比Python還簡單的。
SQL 的作用SQL 面向數據庫執行查詢
SQL 可在數據庫中插入新的記錄
SQL 可更新數據庫中的數據
SQL 可從數據庫刪除記錄
SQL 可在數據庫中創建新表
SQL 可在數據庫中創建視圖
SQL語句分類
共分為四種DDL(data definition language)數據定義語言
主要是對數據庫中的表以及表中的列等的定義和操作
DML(data manipulation language)數據操縱語言
對數據庫里的表中數據進行操作的語言
DCL(Data Control Language)數據庫控制語言
TCL(Transaction Control Language)事務控制語言
其中DDL和DML是最常用的語言,是重中之重,其他兩種忽略
SQLite 數據庫SQLite 是一款輕型的嵌入式數據庫,占用資源及其低,這是它受人青睞的原因之一,在嵌入式設備(如手機)中只需要幾百 K 的內存即可。它不僅支持數據庫通用的增刪改查,還支持事務功能,功能還比較強大。
SQLite 數據庫實際上就是一個文件,這個文件的后綴名通常是 .db,database的縮寫,它的第一個版本誕生于 2000 年,最近版本為 SQLite3。
除了SQLite數據庫,還有其他幾種常見的數據庫,例如Oracle、SQL Server、MySQL等等
這里我們選取SQLite作為入門來學習數據庫,因為它搭建非常簡單,極容易上手。與之相比,其他的數據庫都需安裝,配置,啟動服務等等操作。而Python在標準庫已經自帶了這種數據庫。
SQLite 中的數據類型
數據庫是存儲數據的,它自然會對數據的類型進行劃分,SQLite 劃分有五種數據類型(不區分大小寫)NULL 類型,取值為 NULL,表示沒有或者為空
INTERGER類型,取值為帶符號的整數,即可為負整數
REAL類型,取值為浮點數
TEXT 類型,取值是字符串
BLOB類型,是一個二進制的數據塊,即字節串,可用于存放純二進制數據,例如圖片
DDL語句
簡單說,其實主要就是用來創建表的,當然也可以刪除表,或者修改表的定義,比如原表只有三列,現在需要五列,就要修改表的定義概念理解表: 可以理解為我們通常所說的二維表,分為橫縱(行列),用于存放數據
字段: 就是表中的列名
主鍵:就是一種特殊的列。每一行數據的主鍵不能相同,是這一行數據的唯一標識,就像人的身份證號
創建表1create table 表名稱(列名1 類型 配置, 列名2 類型 配置, 列名3 類型 配置);
注意,SQL語言是不區分大小寫的,create 也可以寫成CREATE。另外,每一句SQL語句后面都需要一個;號結尾
示例:1create table contacts (
2 id integer primary key autoincrement,
3 name text not null ,
4 phone text not null default 'unknow');
上面的DDL語句創建了一個叫contacts的表,并且定義了三個列,分別是id、name和phone,并且給每一個列定義了數據類型,分別是integer、text、text,這表明,id只能是一個整數,name和phone只能是字符串。
除了這些,還對每一個列做了一些配置,或者叫約束。
primary key autoincrement 的意思是指將id這個列定義為主鍵,并且從1開始自動增長,也就是說id這個列不需要人為的手動去插入數據,它會自動增長。
not null 指明這一列不能為空,當你插入數據時,如果不插入name或者phone的值,那么就會報錯,無法完成這一次插入。
default 'unknow' default關鍵字代表設置默認值,這里指定它默認值是字符串'unkonw',當不插入這一列數據時,默認就是這個值。此處寫法是有些多余的,它與not null 一起用是沒有意義的,因為not null已經指明這一列必須插入,不可能為null,那就不需要默認值了,當然,此處只是為了演示default的用法
特別注意
當Python程序運行建表語句時,如果表已經存在了,再去創建一遍會報錯崩潰,因為你的程序第一次運行時執行了一遍建表語句,第2次第3次…去執行,表已經在第1次的時候創建了,這個時候就報錯崩潰了。因此通常需要在建表語句中加入一個判斷,判斷這個表是否存在。1create table if not exists stu_info(
2 id integer primary key autoincrement,
3 name text not null,
4 number text);
如上所示,在建表語句中增加了一個if not exists的判斷,每次運行都會先判斷,不存在才會執行后面的語句創建
刪除表1 drop table 表名稱;
2 drop table if exists 表名稱;
修改表1/* 修改表名稱 */
2alter table 原表名 rename to 新表名;
3
4/* 添加新列 */
5alter table 表名稱 add column 列名1 類型 配置,列名2 類型 配置
示例:1alter table contacts rename to students;
2alter table contacts add column email text,qq text not null;
DML語句
對數據庫里的表數據進行相應的增、刪、改、查的操作。注意,這里是表中的數據,而DDL則是對表的結構進行創建或修改,注意區分
添加1#想要插入的字段和值的順序要一一對應起來
2insert into 表名稱 (字段1,字段2,字段3……) values (被插入的值1,值2,值3……)
3
4insert into 表名稱 values(值1,值2,值3……)
要注意,使用簡略的語句,必須插入全部字段,順序對應,不能遺漏一個
示例:1insert into stu_info (name,number,age) values("zhangsan","20171220",20);
刪除1delete from 表名稱 where 字段 = 條件;
2
3# 用于刪除表中所有數據,但不刪除表
4delete from 表名 或者 delete * from 表名
示例:1delete from stu_info where number = "20171221";
修改1update 表名稱 set 字段1=值1,字段2=值2,…… where 字段 = 條件;
注意,此處值是你要修改的值,此語句可用來修改滿足條件的一行或多行
示例:1update stu_info set name = "zhangsan",age=10 where number = "20171221";
查詢1#查詢的字段就是你要查詢的列名,用*可表示查詢全部字段
2select 查詢的字段 from 表名稱 where 字段 = 條件;
3
4#查詢整張表的所有數據
5select * from 表名稱;
示例:1select * from food_types where name = "apple"
多表查詢
如果兩張表有關系,譬如,一張表是班干部表,記錄了所有班干部,另一張表是全體學生表,記錄每一個學生的情況,那么顯然這兩種表是有關系的。因為一個人既可以在學生表中,也可以在班干部表中。如果我們在班干部表中查到了他的學號,那么就可以用這個學號再去全體學生表中查出他的全部信息,包括考試成績等等這些,這就是所謂的多表查詢。
如下例,我們需要查詢的是table1中的abc字段的內容,則從table1,table2兩張表去查,當滿足條件table1中的xxx字段的內容等于table2中的xxx字段的內容時,就返回這些符合條件的數據。1select table1.abc from table1,table2 where table1.xxx=table2.xxx;
或者等價于1select table1.abc from table1 inner join table2 on table1.xxx=table2.xxx;
特別注意
SQL語句中,text類型的字符串常量需要用單引號或者雙引號括起來,推薦使用單引號。
例如:1select * from stu_info where name = 'zhangsan'
以上也就是數據庫中常說的所謂CRUD操作(create、read、update、delete),分別代表對數據的增刪改查。
Python中的SQLite
操作SQLite
操作該數據庫的大致步驟就是連接數據庫,然后對數據庫進行增刪改查等操作即可。
操作步驟導入模塊
連接數據庫,返回連接對象
調用連接對象的execute()方法,執行SQL語句,進行增刪改的操作,如進行了增添或者修改數據的操作,需調用commit()方法提交修改才能生效;execute()方法也可用于執行DDL語句進行創建表的操作
調用連接對象的cursor()方法返回游標對象,然后調用游標對象的execute()方法執行查詢語句,查詢數據庫
關閉連接對象和游標對象
示例代碼:1# 導入模塊
2import sqlite3
3
4# 連接數據庫,返回連接對象
5conn = sqlite3.connect("D:/my_test.db")
6
7# 調用連接對象的execute()方法,執行SQL語句
8# (此處執行的是DDL語句,創建一個叫students_info的表)
9conn.execute("""create table if not exists students_info (
10id integer primary key autoincrement,
11name text,
12age integer,
13address text)""")
14
15# 插入一條數據
16conn.execute("insert into students_info (name,age,address) values ('Tom',18,'北京東路')")
17
18# 增添或者修改數據只會必須要提交才能生效
19conn.commit()
20
21# 調用連接對象的cursor()方法返回游標對象
22cursor = conn.cursor()
23
24# 調用游標對象的execute()方法執行查詢語句
25cursor.execute("select * from students_info")
26
27# 執行了查詢語句后,查詢的結果會保存到游標對象中,調用游標對象的方法可獲取查詢結果
28# 此處調用fetchall方法返回一個列表,列表中存放的是元組,
29# 每一個元組就是數據表中的一行數據
30result = cursor.fetchall()
31
32#遍歷所有結果,并打印
33for row in result:
34 print(row)
35
36#關閉
37cursor.close()
38conn.close()
游標對象
調用連接對象的cursor()方法可以得到一個游標對象,那么游標到底是什么呢?其實可以把游標理解為一個指針,如下圖:
在這里插入圖片描述
圖中的指針就是游標cursor,假設右邊的表就是查詢到的結果,那么可以調用游標對象的fetchone()方法移動游標指針,每調用一次fetchone()方法就可以將游標指針向下移動一行,第一次調用fetchone()方法時,將游標從默認位置移動到第一行1# 調用游標對象的execute()方法執行查詢語句
2cursor.execute("select * from students_info")
3
4# 將游標移動到第一行
5row = cursor.fetchone()
6
7# 當查詢的結果集沒有數據時,向下移動游標會返回空,如果不是空,說明有數據
8if row !=None:
9 print(row)
一行一行的手動去移動太太麻煩,可以使用循環1# 將游標移動到第一行
2row = cursor.fetchone()
3
4# 如果返回的結果集第一行有數據,進入循環
5while row != None:
6 # 打印第一行結果
7 print(row)
8
9 # 將游標指針向下再移動一行
10 row = cursor.fetchone()
上面的例子主要講解了游標的一些概念,通常只有在確定返回的結果只有一條數據(即一行)時,才會使用fetchone()方法,比如按id查詢時,因為id是唯一的,查詢的結果只可能有一條數據或者為空,不可能有多條,這時使用fetchone方法是非常好的。當返回的結果可能為多條數據時,通常使用fetchall()方法,該方法會返回一個結果列表,遍歷這個列表就可得到多條結果。如第一個例子中的用法:1result = cursor.fetchall()
2
3#遍歷所有結果,并打印
4for row in result:
5 print(row)
之前的概念中也講到,實際上執行完查詢語句之后,所有的查詢結果已經保存到cursor對象中,可以直接遍歷cursor對象,與上面的調用fetchall()方法類似,區別就是調用fetchall()方法借助了列表,可以調用一些列表的函數對查詢結果進行操作1#調用游標對象的execute()方法執行查詢語句
2cursor.execute("select * from students_info")
3
4#直接遍歷cursor對象,并打印
5for row in cursor:
6 print(row)
Sqlite防注入
對于某些特殊符號的數據,直接使用上述方法拼接字符串,可能會造成意想不到的錯誤,因此,應當使用另一種安全的,可防Sql注入攻擊的方式插入數據。1cursor.execute("insert into students_info values (?,?,?)",
2('Tom',18,'北京東路'))
這里的?相當于占位符,execute方法的第二個參數是一個元組,元組中的元素會替換掉占位符。注意,這里和字符串拼接是不同的,會進行sql的預編譯,可防止SQL注入
數據庫可視化
當我們創建生成了數據庫之后,使用代碼或命令行來查看數據庫的內容是不方便的,這時候就需要一個界面軟件來打開數據庫查看,不同的數據庫,有不同的可視化軟件,即使同一款數據庫,也會有多種可視化工具,對于Sqlite3而言,推薦使用SQLiteStudio軟件查看 [官網鏈接] https://sqlitestudio.pl/index.rvt
歸納總結
需要注意,sqlite3模塊的connect()函數用于連接數據庫,其中傳入的參數為數據庫的路徑,如果數據庫不存在,則創建數據庫,那么該路徑就是數據庫的保存路徑;如果已經存在數據庫,則打開數據庫,該路徑為當前數據的真實路徑,路徑填寫錯誤,會造成程序崩潰!
Cursor游標對象的幾個常用方法:execute() 執行sql語句,通常執行查詢語句
fetchone() 將游標指針向下移動一行,并返回當前行的數據
fetchall() 從結果中取出所有結果,返回所有結果的列表
close() 關閉游標
查詢返回的一行數據是一個元組,如上面代碼中,print(row),其中row是一個元組,通過row[0]、row[1]等訪問每一列數據,索引0對應上面代碼中的id,索引1對應name,2對應age,以此類推
總結
以上是生活随笔為你收集整理的python自带的数据库_Python小白的数据库入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ipynb和py文件一样吗_文件描述符了
- 下一篇: cefsharp 发送请求服务器_使用