Sweety

Practice makes perfect

导航

Python MySQL使用与实例

Posted on 2017-09-12 19:34  蓝空  阅读(346)  评论(0编辑  收藏  举报

1、Python使用MySQL的流程:
这里写图片描述

2、.启动MySQL服务器:以管理员身份启动“cmd”,输入命令:’net start mysql‘

Python中使用MySQL导入方法:import MySQLdb

3、.创建Connection

  Connection:创建了Python客户端与数据库之间的网络通路。他的参数如下

参数名 类型 说明
host String MySQL的服务器地址
port int MySQL的端口号
user String 用户名
passwd String 密码
db String 使用的数据库
charset String 连接字符集

Connection支持的方法:

方法名 说明
cursor() 创建并且返回游标
commit() 提交当前事物
rollback() 回滚当前事物r()
close() 关闭Connection

4、.获取Cursor.
Cursor:游标对象,用于执行查询和获取结果,它支持的方法如下:

方法名 说明
execute() 用于执行一个数据库的查询命令
fetchone() 获取结果集中的下一行
fetchmany(size) 获取结果集中的下(size)行
fetchall() 获取结果集中剩下的所有行
rowcount 最近一次execute返回数据/影响的行数
close() 关闭游标

实例:

#连接和创建spider数据库
import pymysql
db = pymysql.connect(host='localhost',user='root', password='123456', port=3306)
cursor = db.cursor()
cursor.execute('SELECT VERSION()')
data = cursor.fetchone()
print('Database version:', data)
cursor.execute("CREATE DATABASE spiders DEFAULT CHARACTER SET utf8")
db.close()
#创建表
import pymysql
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()
#插入数据
data = {
'id': '20120001',
'name': 'Bob',
'age': 20
} t
able = 'students'
keys = ', '.join(data.keys())
values = ', '.join(['%s'] * len(data))
sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys, v
alues=values)
try:
    if cursor.execute(sql, tuple(data.values())):
        print('Successful')
        db.commit()
except:
    print('Failed')
    db.rollback()
db.close()

详解:首先我们需要构造插入的字段,id、name 和 age,在这里只需要将data的键名拿过来,然后用逗号分隔即可。所以 ‘, ‘.join(data.keys()) 的结果就是 id, name, age,然后我们需要构造多个 %s 当作占位符,有几个字段构造几个,比如在这里有两个字段,就需要构造 %s, %s, %s,所以在这里首先定义了长度为 1 的数组 [‘%s’] ,然后用乘法将其扩充为 [‘%s’, ‘%s’, ‘%s’],再调用 join() 方法,最终变成 %s, %s, %s。所以我们再利用字符串的 format() 方法将表名,字段名,占位符构造出来

#数据更新
sql = 'UPDATE students SET age = %s WHERE name = %s'
try:
cursor.execute(sql, (25, 'Bob'))
db.commit()
except:
db.rollback()
db.close()

#出现重复时执行更新操作
data = {
'id': '20120001',
'name': 'Bob',
'age': 21
} t
able = 'students'
keys = ', '.join(data.keys())
values = ', '.join(['%s'] * len(data))
sql = 'INSERT INTO {table}({keys}) VALUES ({values}) ON DUPLICATE KEY UPDATE'.format(t
able=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()
#删除数据
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()
#数据查询
'''
它的内部实现是有一个偏移指针来指向查询结果的,最开始偏移指针指向第一
条数据,取一次之后,指针偏移到下一条数据,这样再取的话就会取到下一条数据了。所以
我们最初调用了一次 fetchone() 方法,这样结果的偏移指针就指向了下一条数据,fetchall()
方法返回的是偏移指针指向的数据一直到结束的所有数据,所以 fetchall() 方法获取的结果就
只剩 3 个了,所以在这里要理解偏移指针的概念。
所以我们还可以用 while 循环加 fetchone() 的方法来获取所有数据,而不是用 fetchall() 全部
一起获取出来,fetchall() 会将结果以元组形式全部返回,如果数据量很大,那么占用的开销
会非常高。所以推荐使用如下的方法来逐条取数据:
'''
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')