python中SQL的使用


# 常用的關系型數據庫有 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
)
'''

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM