# 常用的關系型數據庫有 mysql postgresql sqlite 等(具體區別上課再說) # # 傳統數據庫以表的形式存儲數據 # 一張表可以有很多個字段 # 以用戶表為例, 存儲 4 個數據的表結構如下 # 用戶 id # 用戶名 # 密碼 # 郵箱 # # 范例數據如下 # 1 gua 123 gua@qq.com # 2 gua1 23 gua1@q.com # 數據庫通過 SQL 來操作數據 # SQL (結構化查詢語言) # 操作數據庫的接口 也就是操作數據庫的方法 # 增加數據 # 刪除數據 # 修改數據 # 查詢數據 # CRUD # create retrieve update delete # # 數據庫的更多的概念,上課會解釋(文字太蒼白) # 請下載 sqlitebrowser 軟件(這是一個管理 sqlite 數據庫的免費軟件,自行搜索或者等群內鏈接) # SQL 語句如下(僅為范例,上課會講具體的語法) """ INSERT INTO `users`(`id`,`username`,`password`,`email`) VALUES \ (2,'','',NULL); UPDATE `users` SET `username`=? WHERE `_rowid_`='2'; UPDATE `users` SET `password`=? WHERE `_rowid_`='2'; UPDATE `users` SET `email`=? WHERE `_rowid_`='2'; """ """ 幾種關系型數據庫的用法和 sql 語法都極度相似 開發中一般會用 sqlite 數據庫 部署到服務器上的時候才會使用 mysql 等數據庫 下面是 python 操作 sqlite 數據庫的范例代碼 注意,代碼上課會講,你不用看懂,也不用運行 """ import sqlite3 def create(conn): # 注意 CREATE TABLE 這種語句不分大小寫 sql_create = ''' CREATE TABLE `users` ( `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `username` TEXT NOT NULL UNIQUE, `password` TEXT NOT NULL, `email` TEXT ) ''' # 用 execute 執行一條 sql 語句 conn.execute(sql_create) print('創建成功') def insert(conn, username, password, email): sql_insert = ''' INSERT INTO users(username,password,email) VALUES (?, ?, ?); ''' # 下面的寫法用 string.format 拼 sql, 是一個嚴重的安全漏洞 # 會被 SQL 注入 # sql = ''' # INSERT INTO # users(username,password,email) # VALUES # ("{}", "{}", "{}") # '''.format('123', '345', 'a.com') # conn.execute(sql) # 參數拼接要用 ?,execute 中的參數傳遞必須是一個 tuple 類型 conn.execute(sql_insert, (username, password, email)) print('插入數據成功') def select(conn): # 一個注入的用戶名 usr = 'gua" or "1"="1' pwd = 'gua' sql = ''' SELECT id, username, email FROM users WHERE username=? and pwe=? #WHERE # username="{}" and password="{}" #'''.format(usr, pwd) # 這是讀取數據的套路 cursor = conn.execute(sql) print('所有數據', list(cursor)) # for row in cursor: # print(row) def delete(conn, user_id): sql_delete = ''' DELETE FROM users WHERE id=? ''' # 注意, execute 的第二個參數是一個 tuple # tuple 只有一個元素的時候必須是這樣的寫法 conn.execute(sql_delete, (user_id,)) def update(conn, user_id, email): """ UPDATE `users` SET `email`='gua', `username`='瓜' WHERE `id`=6 """ sql_update = ''' UPDATE `users` SET `email`=? WHERE `id`=? ''' conn.execute(sql_update, (email, user_id)) def main(): # 指定數據庫名字並打開 db_path = 'web8.sqlite' conn = sqlite3.connect(db_path) print("打開了數據庫") # 打開數據庫后 就可以用 create 函數創建表 # create(conn) # 然后可以用 insert 函數插入數據 # insert(conn, 'sql4', '1234', 'a@b.c') # 可以用 delete 函數刪除數據 # delete(conn, 1) # 可以用 update 函數更新數據 # update(conn, 1, 'gua@cocode.cc') # select 函數查詢數據 # select(conn) # # 必須用 commit 函數提交你的修改 # 否則你的修改不會被寫入數據庫 conn.commit() # 用完數據庫要關閉 conn.close() if __name__ == '__main__': main() ''' CREATE TABLE `users` ( `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `username` TEXT NOT NULL UNIQUE, `password` TEXT NOT NULL, `email` TEXT ) '''