• python操作Mysql数据库示例


    python库:pymysql

    安装:install pymysql、mysql数据库

    一、连接数据库、创建speder库、查询版本、

    import pymysql
    ##链接数据库
    db = pymysql.connect(host='localhost',user='root', password='123456', port=3306)
    ##用 cursor() 方法获得 MySQL 的操作游标,利用游标来执行 SQL 语句
    cursor = db.cursor()
    ##查询数据库版本语句
    cursor.execute('SELECT VERSION()')
    ##调用fetchone() 方法来获得第一条数据,也就得到了版本号
    data = cursor.fetchone()
    print('Database version:', data)
    ##执行了创建数据库的操作,数据库名称叫做 spiders,默认编码为 utf-8
    #cursor.execute("CREATE DATABASE spiders DEFAULT CHARACTER SET utf8")
    db.close()

    二、创建表

    
    
    import pymysql
    ##创建表
    '''
    字段名    含义    类型
    id    学号    varchar
    name    姓名    varchar
    age    年龄    int
    '''
    
    db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders')
    cursor = db.cursor()
    sql = 'CREATE TABLE IF NOT EXISTS students (id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, age INT NOT NULL, PRIMARY KEY (id))'
    cursor.execute(sql)
    db.close()

    三、插入数据

    #简单插入数据
    import pymysql
    id = '20120001'
    user = 'Bob'
    age = 20
    db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders')
    cursor = db.cursor()
    sql = 'INSERT INTO students(id, name, age) values(%s, %s, %s)'
    
    #升级1.0插入数据,启用防错
    try:
        cursor.execute(sql, (id, user, age))
        '''
        执行 db 对象的 commit() 方法才可实现数据插入,
        这个方法才是真正将语句提交到数据库执行的方法,
        对于数据插入、更新、删除操作都需要调用该方法才能生效
        '''
        db.commit()
    except:
        #如果出错了就把所有数据回滚(即撤消),就像没操作之前一样
        db.rollback()
    db.close()

    3.1、【插入数据2.0升级版,用字典插入数据,不用修改sql语句,只要修改字典即可】

    data = {
        'id': '20120001',
        'name': 'Bob',
        'age': 20
    }
    table = 'students'
    keys = ', '.join(data.keys())
    values = ', '.join(['%s'] * len(data))
    sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values)
    try:
       if cursor.execute(sql, tuple(data.values())):
           print('Successful')
           db.commit()
    except:
        print('Failed')
        db.rollback()
    db.close()

     四、更新数据

    #最简单的方式就是构造一个 SQL 语句然后执行
    sql = 'UPDATE students SET age = %s WHERE name = %s'
    try:
       cursor.execute(sql, (25, 'Bob'))
       db.commit()
    except:
       db.rollback()
    db.close()
    
    
    #【升级版更新数据用字典传入,不需改sql语句】
    data = {
        'id': '20120001',
        'name': 'Bob',
        'age': 21
    }
    
    table = 'students'
    keys = ', '.join(data.keys())
    values = ', '.join(['%s'] * len(data))
    
    #实际用的是插入语句,不过加了ON DUPLICATE KEY UPDATE(主键存在,则执行更新操作)
    sql = 'INSERT INTO {table}({keys}) VALUES ({values}) ON DUPLICATE KEY UPDATE'.format(table=table, keys=keys, values=values)
    update = ','.join([" {key} = %s".format(key=key) for key in data])
    sql += update
    try:
        if cursor.execute(sql, tuple(data.values())*2):
            print('Successful')
            db.commit()
    except:
        print('Failed')
        db.rollback()
    db.close()   

    '''
    在这里完整的 SQL 构造出来是这样的:
    INSERT INTO students(id, name, age) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE id = %s, name = %s, age = %s
    相比上面介绍的插入操作的 SQL,后面多了一部分内容,那就是更新的字段,ON DUPLICATE KEY UPDATE 使得主键已存在的数据进行更新,
    后面跟的是更新的字段内容。所以这里就变成了 6 个 %s。所以在后面的 execute() 方法的第二个参数元组就需要乘以 2 变成原来的 2 倍。 如此一来,我们就可以实现主键不存在便插入数据,存在则更新数据的功能了 '''
    
    

    五、删除数据

    #删除
    table = 'students'
    condition = 'age > 20'
    
    sql = 'DELETE FROM  {table} WHERE {condition}'.format(table=table, condition=condition)
    try:
        cursor.execute(sql)
        db.commit()
    except:
        db.rollback()
    
    db.close()
    '''
    这里我们指定了表的名称,删除条件。因为删除条件可能会有多种多样,运算符比如有大于、小于、等于、LIKE等等,
    条件连接符比如有 AND、OR 等等,所以不再继续构造复杂的判断条件,在这里直接将条件当作字符串来传递,以实现删除操作
    '''

    六、查询数据

    #【查询数据,升级操作,防止内存开销过大】
    sql = 'SELECT * FROM students WHERE age >= 20'
    try:
        cursor.execute(sql)
        print('Count:', cursor.rowcount)
        row = cursor.fetchone()
        while row:
            print('Row:', row)
            row = cursor.fetchone()
    except:
        print('Error')
    
    '''
    不用fetchall,而用fetchone这样每循环一次,
    指针就会偏移一条数据,随用随取,简单高效
    '''
    
    
    #查询数据,简单操作会比较费内存
    sql = 'SELECT * FROM students WHERE age >= 20'
    try:
        cursor.execute(sql)
        print('Count:', cursor.rowcount)
        one = cursor.fetchone()
        print('One:', one)
        results = cursor.fetchall()
        print('Results:', results)
        print('Results Type:', type(results))
        for row in results:
            print(row)
    except:
        print('Error')
    '''
    运行结果:
    Count: 4
    One: ('20120001', 'Bob', 25)
    Results: (('20120011', 'Mary', 21), ('20120012', 'Mike', 20), ('20120013', 'James', 22))
    Results Type: <class 'tuple'>
    ('20120011', 'Mary', 21)
    ('20120012', 'Mike', 20)
    ('20120013', 'James', 22)
    '''
  • 相关阅读:
    从头实现一个简易版的React虚拟dom和diff算法
    如何理解虚拟DOM
    crate-react-app 之 css modules
    react-router-dom
    slider插件 滚动条插件 基于g2-plugin-slider.js修改
    React 在body上绑定事件以及阻止事件冒泡
    React 动态填加class
    python三大器之 迭代器与生成器
    装饰器常用形态(结合装饰器起飞版来看)
    装饰器之起飞版
  • 原文地址:https://www.cnblogs.com/chenxi188/p/10566015.html
Copyright © 2020-2023  润新知