1.数据库基本操作
连接数据库前,请先确认以下事项:
您已经创建了数据库 TESTDB.
在TESTDB数据库中您已经创建了表 EMPLOYEE
EMPLOYEE表字段为 FIRST_NAME, LAST_NAME, AGE, SEX 和 INCOME。
这里假设连接数据库TESTDB使用的用户名为 “testuser” ,密码为 “test123”
在你的机子上已经安装了 Python pymysql 模块。
import pymysql
# 打开数据库连接
db = pymysql.connect(host='localhost',
user='testuser',
password='test123',
database='TESTDB')
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 使用 execute() 方法执行 SQL 查询
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()
print("Database version : %s " % data)
# 关闭数据库连接
db.close()
Python查询Mysql使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据。
- fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
- fetchall(): 接收全部的返回结果行
import pymysql
# 打开数据库连接
db = pymysql.connect(host='localhost',
user='testuser',
password='test123',
database='TESTDB')
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 查询语句
sql = "SELECT * FROM EMPLOYEE WHERE INCOME=100"
try:
# 执行SQL语句
cursor.execute(sql)
# 获取所有记录列表
results = cursor.fetchall()
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
income = row[4]
# 打印结果
print("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \
(fname, lname, age, sex, income))
except:
print("Error: unable to fetch data")
简单的来讲操作数据库分为一下步骤
- 先使用cursor()创建游标对象。
- 书写要执行的SQL语句
- 调用游标的execute方法下执行SQL命令
- 之后调用commit方法将结果提交给数据库即可
2. 封装操作数据库类
import pymysql
class MySQL:
# db = pymysql.connect("localhost","user","test123","TESTDB" )
def __init__(self, _user, _passwd, _database, _host='127.0.0.1', _port=3306, _charset='utf8'):
self.conPtr = pymysql.connect(
user=_user,
passwd=_passwd,
database=_database,
host=_host,
port=_port,
charset=_charset,
)
# 创建游标对象修改数据库
self.curPtr = self.conPtr.cursor()
def __execute(self, sql):
try:
self.curPtr.execute(sql)
self.conPtr.commit()
print('INFO:操作成功')
except:
self.conPtr.rollback()
def CreateDatabase(self, sql):
self.curPtr.execute(sql)
# 查找一条语句
def Search(self, sql):
self.curPtr.execute(sql)
result = self.curPtr.fetchone()
return result
# 查找多条数据
def SearchAll(self, sql):
self.curPtr.execute(sql)
result = self.curPtr.fetchall()
return result
# 更新SQL
def UpdateSQL(self, sql):
self.__execute(sql)
# 插入操作
def InsertSQL(self, sql):
self.__execute(sql)
# 删除操作
def DropSQL(self, sql):
self.__execute(sql)
# 关闭链接
def Close(self):
self.conPtr.close()
3.实战-爬取豆瓣网电影排行,并将结果保存到数据库中
爬取数据函数采用正则表达式提取数据
import re
def getMoveName(string):
return re.findall('<span style="font-size:13px;">(.*?)</span>', string)
def getMoveStar(string):
return re.findall('<span class="rating_nums">(.*?)</span>', string)
爬取主函数:
from getMySQL import MySQL
from getMessage import getMoveName, getMoveStar
import requests
CreatSQL = '''CREATE TABLE IF NOT EXISTS move_msg(
name VARCHAR(50) COMMENT '电影名称',
grade FLOAT(2,1) COMMENT '电影评分'
)CHARACTER SET 'utf8';'''
url = "https://movie.douban.com/chart"
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 '
'Safari/537.36'
}
con = MySQL('root', '000000', 'python_sql', 'localhost')
con.CreateDatabase(CreatSQL)
def ExitHelp():
Str = input('是否查询爬取结果(yes/no)\n')
if Str == "yes":
msg = con.SearchAll("SELECT * from move_msg;")
for item in msg:
print(f'电影名: {item[0]}\n 评分:{item[1]}\n--------------\n')
# con.DropSQL("DROP TABLE move_msg;")
con.Close()
if __name__ == '__main__':
response = requests.get(url, headers=headers)
if response.status_code != 200:
print("DEAD:获取响应页面失败")
else:
html = response.text
MoveName = getMoveName(html)
MoveStr = getMoveStar(html)
for name, grade in zip(MoveName, MoveStr):
print(f"INFO:电影:{name}和其评分正在写入数据库...\n")
con.InsertSQL("INSERT INTO move_msg(name,grade) VALUES('%s','%s');" % (name, grade))
ExitHelp()
运行结果:
数据库运行图
控制台调试结果: