Python与MySQL数据库之间的增删查改操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38038143/article/details/80845087

使用Python操作数据库之前, 确保已经安装好MySQL和pymysql.

1. 连接数据库
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)

#创建spiders数据库
if cursor.execute('CREATE DATABASE spiders DEFAULT CHARACTER SET utf8'):
    print('Successful')

#关闭链接
db.close()
运行结果:
DATABASE version: ('5.7.22-0ubuntu0.16.04.1',)
Successful
2. 创建表
import pymysql

db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders')
cursor = db.cursor()
#创建slq语句
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()
3. 插入数据
import pymysql

#字典类型数据
data = {
    'id': '1001',
    'name': 'Jack',
    'age': 20
}

db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders')
cursor = db.cursor()

#表名, 字段名, 值
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) #format用于字符串拼接
#查看
print('keys: ', keys)
print('values: ', values)
print('sql: ', sql)

try:
    if cursor.execute(sql, tuple(data.values())):
        db.commit() #将执行语句真正提交到数据库, 不可省略
        print('Success')
except Exception as e:
    print('Faild')
    db.rollback() #数据回滚, 若插入发生错误回到插入数据前

db.close()

至于为何不直接使用sql = ‘INSERT INTO students(id, name, age) values(%s, %s, %s)’, 执行语句为: cursor.execute(sql, (‘1001’, ‘Jack’, ‘20’)). 因为, 如果需要增加字段, 如gender则相当繁琐. 因此, 采用字典来动态添加sql语句, 则不再需要考虑数据有多少字段.

运行结果:
keys:  id,name,age
values:  %s,%s,%s
sql:  INSERT INTO students(id,name,age) VALUES(%s,%s,%s)
Success
查看数据库:
mysql> SELECT * FROM students;
+------+------+-----+
| id   | name | age |
+------+------+-----+
| 1001 | Jack |  20 |
+------+------+-----+
1 row in set (0.00 sec)
4. 更新数据:
import pymysql

#年龄由20更新为22
data = {
    'id': '1001',
    'name': 'Jack',
    'age': 22
}

db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders')
cursor = db.cursor()

table = 'students'
keys = ','.join(data.keys())
values = ','.join(['%s']*len(data))
sql = 'INSERT INTO {table}({keys}) VALUES({values}) ON DUPLICATE KEY UPDATE '.format(table=table, keys=keys, values=values) #ON DUPLICATE KEY UPDATE表示: 如果插入数据id重复, 即主键冲突, 则变为更新数据
update = ','.join([" {keys} = %s".format(keys=keys) for keys in data.keys()])
sql += update #拼接sql 和 update

print('keys: ', keys)
print('values: ', values)
print('update: ', update)
print('sql: ', sql)

try:
    if cursor.execute(sql, tuple(data.values())*2): #由于共6个%s, 则需要两个tuple
        db.commit()
        print('Success')
except Exception as e:
    print('Faild')
    db.rollback()

db.close()

ON DUPLICATE KEY UPDATE表示: 如果插入数据id重复, 即主键冲突, 则变为更新数据

运行结果:
keys:  id,name,age
values:  %s,%s,%s
update:   id = %s, name = %s, age = %s
sql:  INSERT INTO students(id,name,age) VALUES(%s,%s,%s) ON DUPLICATE KEY UPDATE  id = %s, name = %s, age = %s
Success
数据库:
mysql> SELECT * FROM students;
+------+------+-----+
| id   | name | age |
+------+------+-----+
| 1001 | Jack |  22 |
+------+------+-----+
1 row in set (0.00 sec)
5. 删除数据:
import pymysql

db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders')
cursor = db.cursor()

table = 'students'
condition = 'age >= 20' #条件

sql = 'DELETE FROM {table} WHERE {condition}'.format(table=table, condition=condition)

try:
    cursor.execute(sql)
    db.commit()
    print('Successful')
except Exception as e:
    print('Faild')
    db.rollback()

db.close()
数据库:
mysql> SELECT * FROM students;
Empty set (0.00 sec)
6. 查询数据:
import pymysql

data = [
{
    'id': '1001',
    'name': 'Jack',
    'age': 20
}, {
    'id': '1002',
    'name': 'Rose',
    'age': 21
}, {
    'id': '1003',
    'name': 'Mike',
    'age': 22
}, {
    'id': '1004',
    'name': 'Tom',
    'age': 23
}]

db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders')
cursor = db.cursor()

#表名, 字段名, 值
table = 'students'
keys = ','.join(data[0].keys()) #data[0]以第一个字典为格式
values = ','.join(['%s']*len(data[0]))
sql = 'INSERT INTO {table}({keys}) VALUES({values}) ON DUPLICATE KEY UPDATE '.format(table=table, keys=keys, values=values) #ON DUPLICATE KEY UPDATE表示: 如果插入数据id重复, 即主键冲突, 则变为更新数据
update = ','.join([" {keys} = %s".format(keys=keys) for keys in data[0].keys()])
sql += update #拼接sql 和 update

'''数据插入'''
for value in data:
    try:
        if cursor.execute(sql, tuple(value.values())*2): #由于共6个%s, 则需要两个tuple
            db.commit()
    except Exception as e:
        db.rollback()

'''数据查询'''
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)
except Exception as e:
    print(e)

db.close()

前大部分的数据插入完全可以简化为数据库执行语句: INSERT INTO students(id, name, age) VALUES(‘1001’, ‘Jack’, 20), (‘1002’, ‘Rose’, 21), (‘1003’, ‘Mike’, 22), (‘1004’, ‘Tom’, 23);

运行结果:
Count:  4
One:  ('1001', 'Jack', 20)
Results:  (('1002', 'Rose', 21), ('1003', 'Mike', 22), ('1004', 'Tom', 23))

可见, 返回的数据类型为元组. 为何cursor.fetchall()返回的只有三个数据?而不是全部? 原因在于, cursor返回数据是根据游标的指向来返回, 前一句fetchone()已经返回一条数据后, 游标将指向下一条数据, 因此, fetchall()只返回了剩下的三条数据.

猜你喜欢

转载自blog.csdn.net/qq_38038143/article/details/80845087