• pymysql的使用-python连接MySQL数据库代码


    一、pymysql使用

    1. 安装:pip install pymysql
    2. 导包:import pymysql
    3. 调用connect()函数创建连接对象:conn = pymysql.connect(参数列表),参数如下
      1. host:连接mysql的主机,本机为‘localhost’
      2. port:连接mysql主机的端口,默认3306
      3. user:连接的用户名
      4. password:连接的用户名密码
      5. database:连接的数据库名
      6. charset:通信采用的编码方式,推荐使用utf8
    4. 获取游标对象:cursor = conn.crusor(),目标是要执行SQL语句,完成对数据库的增删改查操作
    5. 执行SQL语句:count = cursor.execute(sql),返回受影响的行数,主要用于执行insert、update、delete、select等SQL语句
      1. 获取查询结果集中的第一条数据:cursor.fetchone(),返回一个元组
      2. 获取查询结果集中的所有数据:cursor.fetchall(),返回一个元组
    6. 获取查询结果集:result = cursor.fetchall()
    7. 将修改操作提交到数据库:conn.commit()
    8. 回滚/撤销数据:conn.rollback()
    9. 关闭游标:cursor.close()
    10. 关闭连接:conn.close()

     二、pymysql完成对数据库表中数据的查询操作

    1. import pymysql
    2. # 创建连接对象
    3. conn = pymysql.connect(host="localhost", port=3306, user='root', password='******', database='python_sql', charset='utf8')
    4. cur = conn.cursor() # 获取游标对象
    5. sql = 'select * from students;' # 查询SQL语句
    6. rowCount = cur.execute(sql) # 执行SQL语句,返回执行过程中影响的行数
    7. print('SQL语句执行过程中影响的行数为%d' % rowCount)
    8. # print(cur.fetchone()) # 取出结果集中的一条数据,输出:(2, 'XY', 20, None, '男', b'\x00', 3)
    9. for i in cur.fetchall(): # 取出所有数据
    10. print(i)
    11. cur.close() # 关闭游标
    12. conn.close() # 关闭连接
    13. 输出:
    14. SQL语句执行过程中影响的行数为6
    15. (2, 'XY', 20, None, '男', b'\x00', 3)
    16. (3, 'YX', 18, None, '女', b'\x00', 2)
    17. (4, 'XY', None, None, None, b'\x01', None)
    18. (7, 'XYY', 18, None, '女', b'\x01', None)
    19. (8, 'YXX', 18, None, '女', b'\x00', None)
    20. (9, 'XX', 25, None, None, b'\x01', None)

    三、 pymysql完成对数据库表中数据的增、删、改操作

    1. import pymysql
    2. # 创建连接对象
    3. conn = pymysql.connect(host="localhost", port=3306, user='root', password='******', database='python_sql', charset='utf8')
    4. cur = conn.cursor() # 获取游标对象
    5. # try:
    6. # sql = "insert into students(id,name,age,gender,sid) values(10,'yy', 19, '男', 3);" # 添加
    7. # sql = "delete from students where id=7;" # 删除
    8. sql = "update students set age=21 where id=8;" # 修改
    9. rowCount = cur.execute(sql) # 执行SQL语句,返回执行过程中影响的行数
    10. print('SQL语句执行过程中影响的行数为%d' % rowCount)
    11. conn.commit()
    12. # except Exception as e:
    13. # conn.rollback() # 撤销上面的SQL操作
    14. cur.close() # 关闭游标
    15. conn.close() # 关闭连接

    四、防止SQL注入

    SQL注入:用户提交带有恶意的数据与SQL语句进行字符串方式的拼接,从而影响了SQL语句的语义,最终产生数据泄露的现象

    • 防止SQL注入:SQL语句参数化
      • SQL语句中的参数使用%s来占位,此处非字符串格式化操作
      • 将SQL语句%s占位所需要的参数存在一个列表中,把参数列表传递给execute方法中的第二个参数
    1. import pymysql
    2. def main():
    3. search_name = input('请输入姓名:')
    4. # 创建连接对象
    5. conn = pymysql.connect(host="localhost", port=3306, user='root', password='******', database='python_sql', charset='utf8')
    6. cur = conn.cursor() # 获取游标对象
    7. # 非安全方式
    8. # sql = "select * from students where name='%s';" % search_name # 查询SQL语句
    9. # print('sql语句为%s' % sql)
    10. # rowCount = cur.execute(sql) # 执行SQL语句,返回执行过程中影响的行数
    11. # 安全方式
    12. params = [search_name] # 构造参数列表
    13. rowCount = cur.execute("select * from students where name=%s", params) # 若有多个参数,需参数化,params = [参数1, 参数2....],此时sql语句中有多个%s,其中%s无需带引号
    14. print('SQL语句执行过程中影响的行数为%d' % rowCount)
    15. # result = cur.fetchone()
    16. result = cur.fetchall()
    17. print('查询结果为:\n', result)
    18. cur.close() # 关闭游标
    19. conn.close() # 关闭连接
    20. if __name__ == '__main__':
    21. main()
    22. 输出:
    23. ------------------------------------------非安全方式--获取一条数据-------------------------
    24. 请输入姓名:XY
    25. sql语句为select * from students where name='XY';
    26. SQL语句执行过程中影响的行数为2
    27. 查询结果为:
    28. (2, 'XY', 20, None, '男', b'\x00', 3)
    29. ------------------------------------------安全方式--获取所有------------------------------
    30. 请输入姓名:XY
    31. SQL语句执行过程中影响的行数为2
    32. 查询结果为:
    33. ((2, 'XY', 20, None, '男', b'\x00', 3), (4, 'XY', None, None, None, b'\x01', None))
    34. -----------------------------------------------------------------------------------------

    学习导航:http://xqnav.top/ 

  • 相关阅读:
    Vue(uniapp)父组件方法和子组件方法执行优先顺序
    12种常见的恶意软件类型与防范建议
    TCP重传机制、滑动窗口、流量控制、拥塞控制
    JSONException: A JSONObject text must begin with ‘{‘ at character 0
    空间不够用了怎么办
    失效的访问控制漏洞复现(dvwa)
    【2023】redis-stream配合spring的data-redis详细使用(包括广播和组接收)
    【应用】Docker Swarm
    JavaScript基础知识14——运算符:逻辑运算符,运算符优先级
    Day06-Java面向对象基础之类和对象
  • 原文地址:https://blog.csdn.net/qq_43874317/article/details/127752524