Python基础MySQL数据库 *** 作

Python基础MySQL数据库 *** 作,第1张

需要的库:pymysql

请大家下载MySQL后使用可视化工具创建数据库,本文不推荐使用sql语句创建database和表。

创建数据库的命令参考这篇文章:MYSQL创建数据库,表,以及相关查询命令_清酒忄的博客-CSDN博客_mysql创建读者信息表

1,连接数据库

在连接数据库之后我们还需要cursor也就是游标来 *** 作数据库里的数据

import pymysql


# 参数分别是ip,用户,密码,端口(默认3306),数据库名字
db = pymysql.connect(host='localhost', user='root', password='12345678', port=3306, db='spiders')
# 得到游标对象
cursor = db.cursor()
# 必须要有close语句!!!
db.close()
2,最基础的pymysql执行的流程
import pymysql


db = pymysql.connect(host='localhost', user='root', password='12345678', port=3306)
cursor = db.cursor()
# 这里来执行创建一个新sql数据库语句,如果执行的是插入数据,还需要db.commit()来提交
cursor.execute(‘CREATE DATABASE spiders’)
# 关闭数据库必须要有,否则数据可能存储失败或损坏
db.close()
3,插入数据

这里直接用格式化sql语句来 *** 作浮动的字典,其中键是title

import pymysql

# 这是一个动态字典
data_dict = {
    'id': '20220420',
    'name': 'DJY',
    'age': 14,
    'gender': 'girl'
}
tabel = 'students'
# 创造键
keys = ', '.join(data_dict.keys())
print(keys)
# 创造跟值等数量的占位符
values = ', '.join(['%s'] * len(data_dict.values()))
print(values)
# 参数db是创建后数据库的名字。
db = pymysql.connect(host='localhost', user='root', password='12345678', port=3306, db='spiders')
cursor = db.cursor()
# 下面的sql语句表示往students中插入几个值,%s是占位符,在execute里用元组传过来就好了
# 用这样的方式传入字典,可以有动态的效果
sql = f'INSERT INTO {tabel}({keys}) values({values})'
try:
    cursor.execute(sql, tuple(data_dict.values()))  
    # 在插入或者删除中commit是真正将sql语句上传执行的环节
    db.commit()
except Exception as e:
    print(e)
    # 如果发生了错误,就回溯,就像什么都没有发生过。
    db.rollback()
finally:
    db.close()

最基础的插入sql语句是这样的

‘INSERT INTO tabel(keys) values(values)’
---------------------------------------------------------------------

在爬虫的过程中,有的时候我们会有重复的数据,在我们的表中是可以设置主键的,而这些主键是不可以重复的,就像id,所以说如果主键已经存在了,那么就应该覆盖原来的数据。这只要加一个update语句即可实现。

import pymysql

# 这是一个动态字典
data_dict = {
    'id': '20220420',
    'name': 'DJY',
    'age': 14,
    'gender': 'girl'
}
tabel = 'students'
# 创造键
keys = ', '.join(data_dict.keys())
print(keys)
# 创造跟值等数量的占位符
values = ', '.join(['%s'] * len(data_dict.values()))
print(values)
# 这里来创建一个update的格式
update_list = []
for key in data_dict.keys():
    update_list.append(f'{key} = %s')
update = ', '.join(update_list)
print(update)
# 参数db是创建后数据库的名字。
db = pymysql.connect(host='localhost', user='root', password='12345678', port=3306, db='spiders')
cursor = db.cursor()
# 下面的sql语句表示往students中插入几个值,%s是占位符,在execute里用元组传过来就好了
# 用这样的方式传入字典,可以有动态的效果,ON...表示如果主键重复,那么就更新数据
sql = f'INSERT INTO {tabel}({keys}) values({values}) ON DUPLICATE KEY UPDATE '
sql += update
print(sql)
try:
    cursor.execute(sql, tuple(data_dict.values())*2)  # 因为有六个占位符,所以*2
    # 在插入数据中commit才是真正提交 *** 作sql的语句
    db.commit()
except Exception as e:
    print(e)
    # 如果发生了错误,就回溯,就像什么都没有发生过。
    db.rollback()
finally:
    db.close()

原语句长这样

‘INSERT INTO tabel(keys) values(values) ON DUPLICATE KEY UPDATE keys = ‘values’’

 

4,删除数据

sql的删除数据需要有一个条件,因为逻辑联接符很多,所以采用字符串拼接的方法

condition = 'gender = "None"' # 表示删除gender为‘None’的数据,其他运算符参考文档
del_sql = f'DELETE FROM {tabel} WHERE {condition}'
try:
    cursor.execute(del_sql)
    db.commit()
except Exception as e:
    print(e)
    # 如果发生了错误,就回溯,就像什么都没有发生过。
    db.rollback()
finally:
    db.close()

原语句长这样

‘DELETE FROM tabel WHERE condition’

5,查询数据

MySQL内部有一个偏移指针,每调用一次fetchone就会把指针向下偏移一个单位,而fetchall就会直接偏移到表的最底部。查询语句同样有条件的选择。

condition2 = 'age <= 15'  # 表示查询age小于等于15的数据
find_sql = f'SELECT * FROM {tabel} WHERE {condition2}'
try:
    cursor.execute(find_sql)
    # fetchone是查询第一条,fetchall是查询所有, 返回是元组,如果没有条目就返回None
    # sql内部有一个偏移指针,最开始是指向第一条数据,当我们使用一次fetchone方法,偏移指针就会偏移到下一条数据
    first_data = cursor.fetchone()
    print(first_data)
    total_data = cursor.fetchall()  # 调用了一次fetchone指针向后偏移所以现在是第二条到最后一条
    print(total_data)
    # 在插入数据中commit才是真正提交操作sql的语句
    db.commit()
except Exception as e:
    print(e)
    # 如果发生了错误,就回溯,就像什么都没有发生过。
    db.rollback()
finally:
    db.close()

不建议使用fetchall来查询,这样的话如果数据量过大会占用太多的内存资源,因为内部指针的特性,我们可以用while语句来一条一条查询,只要fetchone找不到了就会返回None,那么循环也就结束了。

condition2 = 'age <= 15'  # 表示查询age小于等于15的数据
find_sql = f'SELECT * FROM {tabel} WHERE {condition2}'
try:
    cursor.execute(find_sql)
    # fetchone是查询第一条,fetchall是查询所有, 返回是元组,如果没有条目就返回None
    # sql内部有一个偏移指针,最开始是指向第一条数据,当我们使用一次fetchone方法,偏移指针就会偏移到下一条数据
    data = cursor.fetchone()
    # 如果data是有数据的那么一直循环,是None了就结束循环了
    while data:
         data = cursor.fetchone()
         print(data)
except Exception as e:
    print(e)
    # 如果发生了错误,就回溯,就像什么都没有发生过。
    db.rollback()
finally:
    db.close()

原来的长这样

‘SELECT * FROM tabel WHERE condition‘
6,结语
MySQL与Mongodb同样都是在爬虫领域应用广泛的数据库,爬虫推荐非关系型数据库Mongodb它可以避免返回来的数据重新排序并建表的过程,相对来说更加的方便。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/717416.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存