• 数据库---MySql(二)-pymysql


    一、安装

    pip install pymysql

     

    二、使用

    1.Python DB API访问数据库流程

    2.mysql

    2.1 导入mysql模块

    import pymysql

    2.2 建立连接

    使用connect/Connection/Connect这三个建立连接都可以,前两个是后一个函数的引用

    mysql.connect(host,port,user,password,database,charset)

    • host:连接的mysql主机,如果是本机就是localhost
    • port:连接的主机端口,默认是3306
    • user:连接mysql的用户名
    • password:连接mysql的密码
    • database:连接的数据库名称
    • charset:连接使用的编码方式,建议使用utf8
    connect = pymysql.connect('localhost','root','','db1')

    2.3 获取Cursor对象

    通过连接获取游标, cursor = connect.cursor()返回Cursor对象,用于执行sql语句并获得结果

    cursor = connect.cursor()  #后面用fetch获取的结果是元组里面套元组
    cursor = connect.cursor(cursor = pymysql.cursors.DictCursor)  #后面用fetch获取的结果是列表里面套字典

    2.4操作数据库

    2.4.1使用游标执行SQL语句

    cursor.execute(operation , [parameters]),返回受影响的条数(int)

    sql = "select * from t1"
    cursor.execute(sql)

    如果需要上传参数,不要在SQL语句后拼接字符串,防止SQL注入;

    sql = "select * from userinfo where name = %s password=%s" %('"" or 1=1 --',"")   #user是空,or 1=1必然成立,--表示注释,后面部分被注释;userinfo表中并没有user是空的数据;SQL注入
    c= cursor.execute(sql)
    if c:
        print("success")  #结果会打印success
    data = cursor.fetchall()
    print(data)  #打印userinfo表里的所有数据

    需要上传参数,在execute后面传入参数,可以是列表、元组、字典

    sql= "insert into userinfo (name,password) values (%s,%s)"
    cursor.execute(sql,["小王","123456"])  #传入一条数据
    curaor.executemany(sql,(["小张","123456"],["小刘","123456"]))  #传入多条数据
    connect.commit()  #如果是修改表的必须要提交
    
    #传入字典
    sql= "insert into userinfo (name,password) values (%(u)s,%(p)s)"
    cursor.execute(sql,{"u":"小明","p":"123456"})  #传入一条数据
    connect.commit()

    2.4.2提交数据、撤销数据

    connect.commit():提交数据;如果修改了数据库必须提交数据

    connect.rollback():撤销数据;在执行增删改操作时,如果不想提交前面的修改操作,可以使用 rollback 回滚取消操作

    2.4.3获取数据

    fetch获取查询结果数据,返回一个元组嵌套元组;如果获取cursor时设置了connect.cursor(cursor = pymysql.cursors.DictCursor),返回一个列表里面嵌套字典;

    因为在获取数据时,游标是移动的,所以前面取过的数据,后面不会再取了

    curser.fetchone():获取一条数据

    curser.fetchmany(4):获取4条数据,条数可修改

    cursor.fetchall():获取查询结果的所有数据;如果游标不在开头,就不能获取到所有数据

    cursor.scroll(2, mode = "relative"):相对位移;在当前位置移动2位,fetch取当前位置后面的第3位数据;数字可变
    cursor.scroll(2, mode = "absolute"):绝对位移;移动2位,fetch始终取第3位的数据;数字可变
    cursor.lastrowid:获取插入数据的最后一条的自增id
    cursor.description:方法会将每个字段的字段名,字段类型,字段长度...等等字段的属性列出来

    2.5 关闭cursor

    cursor.close()

    2.6 关闭连接

    connect.close()

     

    三、练习

    1.创建表

    
    
    import pymysql

    connect = pymysql.connect('localhost','root','','db1')
    cur = connect.cursor()
    # cur = connect.cursor(cursor = pymysql.cursors.DictCursor)
    #创建表
    sql = """create table userinfo(
         id int unsigned not null auto_increment primary key,
         name char(10) not null,
         password char(10) not null
         )engine=innodb default charset=utf8;"""
    try:
        cur.execute(sql)
        connect.commit()   #提交
    except Exception as e:
        print("错误信息:%s" %e)
        connect.rollback()   #回滚

    #显示表
    sql_s = "show tables;"
    cur.execute(sql_s)
    data = cur.fetchall()
    print(data)
    cur.close()
    connect.close()

    2.插入数据和查询

    import pymysql
    import pandas
    
    connect = pymysql.connect("localhost","root","","db1")
    cur = connect.cursor()
    sql_i = "insert into userinfo (name, password) values (%s, %s)"
    try:
        cur.executemany(sql_i,(('小明','123456'),
                        ('小红','123456'),
                        ('小张','123456'),
                        ('小王','123456'),
                        ('小小明','123456'),
                        ('Lucy','123456')))
        connect.commit()
    except Exception as e:
        print("错误原因:%s" %str(e))
        connect.rollback()
    
    sql_s = "select * from userinfo"
    cur.execute(sql_s)
    data = cur.fetchall()
    print(cur.description)
    header = [t[0] for t in cur.description]
    df = pandas.DataFrame(list(data),columns = header)
    print(df)

    四、简单封装

    import pymysql
    import pandas
    
    class MyPymysql:
    
        def __init__(self,*args):
            self.connect = pymysql.connect(*args)
            self.cur = self.connect.cursor()
    
        def use(self,db):
            """切换数据库"""
            sql = "use %s;"
            self.cur.execute(sql,db)
    
        def create_db(self,db):
            """创建数据库"""
            sql = "create database %s;"
            try:
                self.cur.execute(sql,db)
                self.connect.commit()
            except Exception as e:
                print("错误信息:%s" %e)
                self.connect.rollback()
    
        def show_db(self):
            """显示数据库"""
            sql = "show databases;"
            self.cur.execute(sql)
    
        def create_table(self,sql):
            """创建数据表"""
            try:
                self.cur.execute(sql)
                self.connect.commit()
            except Exception as e:
                print("错误信息:%s" %e)
                self.connect.rollback()
    
        def show_t(self):
            """显示表"""
            sql = "show tables;"
            self.cur.execute(sql)
    
        def insert(self,sql):
            """插入数据"""
            try:
                self.cur.execute(sql)
                self.connect.commit()
            except Exception as e:
                print("错误原因:%s" %e)
                self.connect.rollback()
    
        def select(self,sql):
            """查询表显示所有结果"""
            try:
                self.cur.execute(sql)
                data = self.cur.fetchall()
                header = [t[0] for t in self.cur.description]
                df = pandas.DataFrame(list(data),columns = header)
            except Exception as e:
                print("错误原因:%s" %e)
            return df
    
        def change(self,sql):
            """修改表"""
            try:
                self.cur.execute(sql)
            except Exception as e:
                print("错误原因:%s" %e)
    
    
    if __name__ == "__main__": 
        my = MyPymysql("localhost","root","","db1")
    
        sql_u = "update userinfo set password = '098765';"
        my.change(sql_u)
    
        sql = "select * from userinfo limit 3;"
        data = my.select(sql)
        print(data)       
  • 相关阅读:
    存储:块存储/文件存储/对象存储
    系统调用system call以及strace/dtruss
    JBoss EAP应用服务器部署方法和JBoss 开发JMS消息服务小例子
    在IE中,JS方法名和input的name重名时,调用该方法无效
    html 使表格随着内容自动适应宽度
    Jboss 安全和优化
    java网页数据抓取实例
    Eclipse+Weblogic 12开发简单的Enterprise Application
    eclipse中整合ejb和web工程
    破解 jar 包之直接修改 .class 文件方式
  • 原文地址:https://www.cnblogs.com/he-202007/p/14090732.html
Copyright © 2020-2023  润新知