码迷,mamicode.com
首页 > 数据库 > 详细

pymysql用法

时间:2020-04-08 18:57:41      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:任务   生成器   ack   直接   必须   into   port   inpu   delete   

pymysql用法

一、基础用法

  • 导入:import pymysql

  • 连接数据库:conn=pymysql.connect(host="",user="",password="",database="")

  • 创建游标:cur=conn.cursor()

    • 括号内没有任何设置:查询后输出的结果是元组形式
    • 括号内添加cursor=pymysql.cursors.DictCursor:数据的结果是字典形式的,字典中的key是字段名,value是查询到的对应值
  • 使用pymysql进行查询:cur.execute("mysql语句")

注意:查询语句必须添加双引号,查询语句和mysql的语句一样,没有区别

  • 获取查询到的数据

    • 获取一条数据

      • ret_one = cur.fetchone()
      • print(ret_one)

      可以使用循环连续获取数据

    • 获取多条数据

      • ret_many = cur.fetchmany(num)
      • print(ret_many)

      num是指定的获取数据条数

    • 获取全部的数据

      • ret_all = cur.fetchall()
      • print(ret_all)
  • 为了避免语句执行中存在错误导致出现程序异常,需要做异常处理pymysql.err.ProgrammingError,as e后可以把e打印出来显示异常的具体内容

    try:
    	程序
    except pymysql.err.ProgrammingError as e:
    	print(e)
    
  • 关闭游标:cur.close()

  • 关闭数据库连接:conn.close()

    import pymysql
    conn=pymysql.connect(host="127.0.0.1",user="root",
    password="930215",
    database="department_data")
    # 创建cursor游标
    cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
    try:
    	cur.execute("select * from employee")
    	# cur.execute获取到的查询结果并不能直接显示出来,必须另外获取,这个用法类似于
    	# 生成器的用法
    	# cur.fetchone()只能获取一条数据
    	ret_one = cur.fetchone()
    	print(ret_one)
    	# cur.fetchmany(num)指定获取的数据个数
    	ret_many = cur.fetchmany(3)
    	print(ret_many)
    	# cur.fetchall()获取所有的查询数据
    	ret_all = cur.fetchall()
    	print(ret_all)
    except pymysql.err.ProgrammingError as e:
    	print(e)
    cur.close()
    conn.close()
    
  • 写入、更新和删除数据数据

    • 写入数据
      cur.execute("insert into 表名(字段) values(插入数据);")
    • 更新数据
      cur.execute("update 表名 set 字段=‘‘ where 字段=‘‘")
    • 删除数据
      cur.execute("delete from 表名 where 字段=‘‘")
      conn.commit()
    • 异常处理:如果写入数据不成功,执行回滚:rollback()
    ‘‘‘插入数据‘‘‘
    try:
    	cur.execute("insert into employee(ename,eage,depart_id,etime) values(‘夏侯淳‘,25,103,now())")
    	conn.commit()
    except Exception as e:
    	print(e)
    	conn,rollback()
    

注意:如果只是写了插入的语句,那么就只是把数据写入到内存中,并没有写入磁盘,必须使用conn.commit()进行提交,是conn不是cur这点也需要特别注意

  • 在execute中也可以进行数据表的创建和删除任务

  • 查询一共有多少行数据被影响:print(cur.rowcount)

  • 在执行sql语句后可以使用cur.rowcount来获取总共有几行数据被影响,然后通过循环获取每一个数据

    cur.execute("select * from employee")
    for i in range(cur.rowcount):
    	ret = cur.fetchone()
    	print(ret)
    

二、防止sql注入

  • 导入pymysql:import pymysql
  • 提示用户输入内容
  • 创建连接:conn=pymysql.connect(host=‘‘,user=‘‘,password=‘‘,database=‘‘)
  • 创建游标:cur = conn.cursor()
  • 拼接sql语句:sql = "select * from 表 where user=%s and password=%s"

注意:这里的拼接语句中的字符串后不要直接写拼接的内容,要把拼接的内容放在执行语句中,如果直接拼接的会可能造成sql注入问题,威胁到数据库的安全,这里必须要特别注意。

  • 执行语句:cur.execute(sql,(拼接内容1,拼接内容2))

  • 获取查询的内容

  • 关闭游标:cur.close()

  • 关闭连接:conn.close()

    import pymysql
    username = input("mysql用户名:")
    password = input("mysql密码:")
    conn = pymysql.connect(host="localhost",
                           user="root",
                           password="930215",
                           database="department_data")
    
    cur = conn.cursor()
    sql = "select * from userinfo where username=%s and password=%s"
    # 这里不能直接拼接
    cur.execute(sql,(username,password))
    # 执行语句这里拼接,并且是括号,拼接内容和sql内容要使用逗号隔开
    ret = cur.fetchone()
    print(ret)
    
    cur.close()
    conn.close()
    
    

pymysql用法

标签:任务   生成器   ack   直接   必须   into   port   inpu   delete   

原文地址:https://www.cnblogs.com/ddzc/p/12661619.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!