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