chenxi188

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)
\'\'\'

 

分类:

技术点:

相关文章: