zoukankan      html  css  js  c++  java
  • 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
    )
    '''
  • 相关阅读:
    metasploit 教程之基本参数和扫描
    sql注入学习 sqlliab教程 lesson1 (sqlliab搭建教程)
    metasploit 教程之信息收集
    渗透.
    sqlmap基础入门超详细教程
    网络调试助手 全平台
    python3中的socket
    python3 udp版简单的聊天器
    提交表单外的数据方法
    centos7下端口映射
  • 原文地址:https://www.cnblogs.com/cuzz/p/8245579.html
Copyright © 2011-2022 走看看