zoukankan      html  css  js  c++  java
  • python连接mysql基本操作

    打开数据库连接

    与数据库进行连接需要在pymysql.connect()函数中传入参数数据库地址(本机就写localhost),还有用户名user,密码password,数据库名db;
    返回的是数据的游标,游标可以对数据进行读取,添加,删除等操作

    import pymysql
    # pymysql.connect('本机就写localhost',user = '',passwd=,db = '')
    conn = pymysql.connect('localhost',user = "root",passwd = "10xxxang",db = "pythonDB")
    print (conn) # <pymysql.connections.Connection object at 0x000001C9E1241D30>
    

    数据的游标实例化

    cursor返回一个游标实例对象,其中包含了很多操作数据的方法,比如执行sql语句

    cursor = conn.cursor()
    print(cursor) # <pymysql.cursors.Cursor object at 0x000001C9E1820BA8>
    

    执行sql语句execute

    execute(query,args=None)执行单条的sql语句,执行成功后返回受影响的行数
    query:要执行的sql语句,字符串类型
    args:可选的序列或映射,用于query的参数值。如果args为序列,query中必须使用%s做占位符;如果args为映射,query中必须使用%(key)s做占位符

    cursor.execute('CREATE DATABASE IF NOT EXISTS pythonDB DEFAULT CHARSET utf8 ;') # 这个最好大写
    # 创建user表
    cursor.execute('drop table if exists user')
    sql = """CREATE TABLE IF NOT EXISTS `user` (
    	  `id` int(11) NOT NULL AUTO_INCREMENT,
    	  `name` varchar(255) NOT NULL,
    	  `age` int(11) NOT NULL,
    	  PRIMARY KEY (`id`)
    	) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0
    """
    # 执行创建表的语句
    cursor.execute(sql)
    # 向表中插入数据
    insert = cursor.execute("insert into user values(1,'tom',18)")
    print('添加语句受影响的行数:',insert) # # 添加语句受影响的行数: 1
    
    # 另一种插入数据的方式,通过字符串传入值
    sql = "insert into user values(%s,%s,%s)"
    cursor.execute(sql,(3,'kongsh',20))
    

    执行sql语句executemany

    插入多条数据 executemany(query,args=None)执行成功后返回受影响的行数
    query:要执行的sql语句,字符串类型
    args:嵌套的序列或映射,用于query的参数值;是一个包含多个元组的列表,
    每个元组对应一条mysql中的一条数据。这里的%s不需要加引号,否则插入数据的数据会类型错误

    # coon.select_db('数据库的名字') # 这样可以自主的选择数据库
    sql  =  "insert into user values(%s,%s,%s)"
    insert = cursor.executemany(sql,[(4,'wen',20),(5,'tom',10),(6,'test',30)])
    print('批量插入返回手影响的行数:',insert) #批量插入返回手影响的行数: 3
    

    查询数据

    execute()函数的得到的只是受影响的行数
    cursor对象提供了3种提取数据的方法:fetchone,fetchmany,fetchall
    每种方法都会导致游标移动,注意游标的位置
    cursor.fetchone():获取游标所在处的一行数据,返回元组,没有返回None
    cursor.fetchmany(size):接受size行返回结果行。如果size大于返回的结果行的数量,则会返回cursor.arraysize条数据。
    cursor. fetchall():接收全部的返回结果行。

    # cursor.execute("select * from user;")
    # while 1:
    #     res = cursor.fetchone() #etchone()函数必须跟exceute()函数结合使用,并且在exceute()函数之后使用
    #     # 这个是执行一次返回一个游标所在位置的数据
    #     # 执行过程
    #     '''
    #     以元组的形式返回游标所在处的一条数据,
    #     如果游标所在处没有数据,将返回空元组,
    #     该数据执行一次,游标向下移动一个位置
    #     '''
    #     if res is None:
    #         # 表示已经取完结果集
    #         break
    #     print(res)
    # print('*'*10,'第二种查询数据的方法','*'*10)
    # # fetchmany
    # # 取3条数据
    # res_Tuple = cursor.fetchmany(3)
    # print(type(res_Tuple))
    
    # print(res_Tuple) # ((1, 'tom', 18), (3, 'kongsh', 20), (4, 'wen', 20))
    
    # print('*'*10,'第三种查询数据的方法','*'*10)
    # # fetchall执行完这个方法后,游标将移动到数据库表的最后
    # res_all = cursor.fetchall()
    # print('共有%d条数据:'%len(res_all)) # 共有2条数据:下标移动到了第三位,总共5个数据
    

    更新数据

    #更新一条数据
    
    upadte = cursor.execute("update user set age=100 where name='kongsh'")
    # 更新多条数据
    sal = "update user set age=%s where name=%s"
    update_1 = cursor.executemany(sal,[(15,'kongsh'),(18,'wen')])
    

    删除数据

    # 删除单条数据
    cursor.execute("delete from user where id=1")
    
    # 删除多条数据
    sql = "delete from user where id=%s"
    cursor.executemany(sql,[(3),(4)])
    

    事务回滚

    # 事务回滚,回滚到原来的状态
    conn.rollback() # 要用数据库链接进行事务回滚
    

    事务提交

    cursor.close() # 先关闭游标
    conn.commit() #提交数据
    conn.close() # 再关闭数据库连接

    ### 写入多个sql语句注意点
    1.数据库性能瓶颈很大一部份就在于网络IO和磁盘IO,将多个sql语句放在一起,只执行一次IO,可以有效的提升数据库性能。推荐此方法
    2.用executemany()方法一次性批量执行sql语句,固然很好,但是当数据一次传入过多到server端,可能造成server端的buffer溢出,也可能产生一些意想不到的麻烦。所以,合理、分批次使用executemany是个合理的办法
    努力拼搏吧,不要害怕,不要去规划,不要迷茫。但你一定要在路上一直的走下去,尽管可能停滞不前,但也要走。
  • 相关阅读:
    html添加遮罩层
    html绝对定位如何居中
    springboot上传文件到本地服务器
    遍历一个文件目录,把所有的子目录都列出来
    Java判断cookie中是否有某个具体的cookie
    Redis 如何打开rdb 文件
    crontab -e 如何保存退出
    linux服务器设备上没有空间
    IDEA的SonarLint插件报错Unable to create symbol table for
    使用Rome读取RSS报错,org.xml.sax.SAXParseException: 前言中不允许有内容。
  • 原文地址:https://www.cnblogs.com/wkhzwmr/p/14966391.html
Copyright © 2011-2022 走看看