Python

连接MySQL数据库

PyMySQL

代码示例:

import pymysql


def main():
    db = pymysql.connect(host='localhost',port=3306, user='username', password='password', db='mybase', charset='utf8', cursorclass=pymysql.cursors.DictCursor)  # 创建数据库对象
    """
    1. host
        · 连接的主机(localhost == 127.0.0.1 != 0.0.0.0)
    2. port
        · 端口
    3. user
        · 用户名
    4. password
        · 用户密码
    5. db
        · 数据库名字
    6. charset
        · 字符集
    7. cursorclass
        · 游标类型(默认元组)
    8. pymysql.cursors.DictCursor
        · 字典类型
    """
    try:
        with db.cursor() as cursor:  # 创建游标对象
            result = cursor.execute('SQL语句')  # 第二个实参(tuple)支持占位符(%),返回值:受影响的行数(int)
            '''
            1. cursor.fetchall
                · 拿到查询的所有结果(返回值:tuple内嵌tuple,字典类型的游标则返回list内嵌dict)
            2. cursor.fetchmany
                · 拿到查询结果的指定行数量
            3. cursor.fetchone
                · 拿到查询结果的一行
            4. 获取游标结果时(单次运行)
                · 如果游标先前被读取了X行
                · 那么下一次读取时就会略过X行
            5. 被别名的列获取的查询结果会是别名
            '''
            if result:
                print(f'操作成功,受影响行数:{result}')  # f''为format的简写
            db.commit()  # 手动提交数据(事务:默认不会自动提交数据)
    except pymysql.MySQLError as error:  # 当操作失败时
        print(error)  # 打印失败原因
        db.rollback()  # 回滚
    finally:  # 无论操作成功还是失败
        db.close()  # 手动释放游标对象并关闭连接(不关闭游标可能会占满数据库的最大连接数)


if __name__ == '__main__':
    # 查询语句不用提交、回档、返回受影响的行数
    main()

SQL注入攻击

  1. SQL语句
    • where name='%s' and password='%s'
  2. 输入名称
    • admin
  3. 输入密码
    • X' or '1'='1
  4. 输出结果
    • where name='admin' and password='X' or '1'='1'