python爬虫笔记(3、访问数据库)

# 1.导入pymysql
import pymysql
# 2.创建pymysql连接
conn = pymysql.connect(
                        host='localhost',
                        user='root',
                        password='123456',
                        db='python-mysql',
                        port=3306,
                        charset='utf8mb4')
try: 
    #3.使用cursor()方法获取操作游标 (#TODO:游标来执行sql语句,查询的结果集也保存在游标中)
    cursor = conn.cursor()
    #4.使用 execute() 方法执行 SQL,如果表存在则删除
    cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
    #5.使用预处理语句创建表
    sql = """CREATE TABLE EMPLOYEE (
         FIRST_NAME  CHAR(20) NOT NULL,
         LAST_NAME  CHAR(20),
         AGE INT,  
         SEX CHAR(1),
         INCOME FLOAT )"""
    
    #6.执行sql操作
    cursor.execute(sql)
except Exception as e:
    print(e)
finally:
    conn.close()

第一步:安装pymysql
pip install pymysql

第二步:pymysql.connect()连接数据库函数

host=None, # 要连接的主机地址
user=None, # 用于登录的数据库用户
password='', # 密码
database=None, # 要连接的数据库
port=0, # 端口,一般为 3306
unix_socket=None, # 选择是否要用unix_socket而不是TCP/IP
charset='', # 字符编码
sql_mode=None, # Default SQL_MODE to use.
read_default_file=None, # 从默认配置文件(my.ini或my.cnf)中读取参数
conv=None, # 转换字典
use_unicode=None, # 是否使用 unicode 编码
client_flag=0, # Custom flags to send to MySQL. Find potential values in constants.CLIENT.
cursorclass=<class 'pymysql.cursors.Cursor'>, # 选择 Cursor 类型
init_command=None, # 连接建立时运行的初始语句
connect_timeout=10, # 连接超时时间,(default: 10, min: 1, max: 31536000)
ssl=None, # A dict of arguments similar to mysql_ssl_set()'s parameters.For now the capath and cipher arguments are not supported.
read_default_group=None, # Group to read from in the configuration file.
compress=None, # 不支持
named_pipe=None, # 不支持
no_delay=None, #
autocommit=False, # 是否自动提交事务
db=None, # 同 database,为了兼容 MySQLdb
passwd=None, # 同 password,为了兼容 MySQLdb
local_infile=False, # 是否允许载入本地文件
max_allowed_packet=16777216, # 限制 `LOCAL DATA INFILE` 大小
defer_connect=False, # Don't explicitly connect on contruction - wait for connect call.
auth_plugin_map={}, #
read_timeout=None, #
write_timeout=None,
bind_address=None # 当客户有多个网络接口,指定一个连接到主机

第三步:conn.cursor():获取游标
通过获取到的数据库连接实例conn下的cursor()方法来创建游标
cursor = conn.cursor()

第四步:执行sql语句execute和executemany
1.execute(query,args=None)
函数作用:执行单条的sql语句,执行成功后返回受影响的行数
参数说明:
query:要执行的sql语句,字符串类型
args:可选的序列或映射,用于query的参数值。如果args为序列,query中必须使用%s做占位符;如果args为映射,query中必须使用%(key)s做占位符
2.executemany(query,args=None)
函数作用:批量执行sql语句,比如批量插入数据,执行成功后返回受影响的行数
参数说明:
query:要执行的sql语句,字符串类型
args:嵌套的序列或映射,用于query的参数值

第一种方式:PyMySQL 驱动
PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。 PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。>
安装:pip install pymysql

# 练习一:创建数据库
# coding:utf-8
# 1、导入pymysql
import pymysql

#2、创建pymysql连接
conn = pymysql.connect(
    host='localhost',
    user='root',
    password='123456',
    port=3306
)
#3、获取游标
cursor = conn.cursor()
#4、准备要执行的sql语句:
sql = "CREATE DATABASE IF NOT EXISTS mycrawler CHARSET utf8 COLLATE utf8_general_ci;"
#5、使用execute执行sql语句:
cursor.execute(sql)
#6、关闭连接
conn.close()
print("创建数据库成功")
#练习二:创建数据表
# coding:utf-8
# 1、导入pymysql
import pymysql
#2、创建pymysql连接
conn = pymysql.connect(
    host='localhost',
    user='root',
    password='123456',
    database='mycrawler',
    port=3306
)
#3、获取游标
cursor = conn.cursor()
#4、准备要执行的sql语句:
sql="""CREATE TABLE IF NOT EXISTS `user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) NOT NULL,
      `age` int(11) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0"""
#5、使用execute执行sql语句:
cursor.execute(sql)
#6、关闭连接
conn.close()
print("创建数据表成功")
#练习三:插入数据
# coding:utf-8
# 1、导入pymysql
import pymysql
#2、创建pymysql连接
conn = pymysql.connect(
    host='localhost',
    user='root',
    password='123456',
    database='mycrawler',
    port=3306
)
#3、获取游标
cursor = conn.cursor()
#4、准备要执行的sql语句:
#(1)插入单条数据
# sql="""insert into user(id,name,age) \
#        values(2,'wang',12)"""
# (2)另一种插入单条数据
# sql ="""insert into user(id,name,age) \
#         values(%s,%s,%s)% \
#         (3,'zhang',21)"""
# (3)另一种插入数据的方式,通过字符串传入值
#  sql="insert into user values(%s,%s,%s)"
#  cursor.execute(sql,(3,'zhang',21))
#5、使用execute执行sql语句:
try:
    cursor.execute(sql)
    #提交到数据库执行
    conn.commit()
except:
    #如果发生错误进行回滚
    conn.rollback()
#6、关闭连接
conn.close()
print("插入数据成功")
#练习四:批量插入多条数据
# coding:utf-8
# 1、导入pymysql
import pymysql
#2、创建pymysql连接
conn = pymysql.connect(
    host='localhost',
    user='root',
    password='123456',
    database='mycrawler',
    port=3306
)
#3、获取游标
cursor = conn.cursor()
#4、准备要执行的sql语句:
sql="insert into user values(%s,%s,%s)"
#5、使用execute执行sql语句:
try:
    cursor.executemany(sql,[(3,'zhang',21),(4,'zheng',11)])
    conn.commit()
except:
    #如果出现错误回滚
    conn.rollback()
#6、关闭连接
conn.close()
print("插入多个数据成功")
#练习五:查询操作
# fetchone(): 该方法获取下一个查询结果集。结果集是一个对象(返回元组)  
# fetchall(): 接收全部的返回结果行.
# fetchmany(): 接收全部的返回结果行.
# rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。
# coding:utf-8
# 1、导入pymysql
import pymysql
#2、创建pymysql连接
conn = pymysql.connect(
    host='localhost',
    user='root',
    password='123456',
    database='mycrawler',
    port=3306
)
#3、获取游标
cursor = conn.cursor()
#4、准备要执行的sql语句:
sql = "select * from user"
#5、使用execute执行sql语句:
try:
    cursor.execute(sql)
    results = cursor.fetchall()
    for re in results:
        id = re[0]
        name= re[1]
        age = re[2]
        print("id=%s,name=%s,age=%s"%(id,name,age))
except:
    print("出现错误")
# cursor.execute(sql)
# results = cursor.fetchall()
# print(type(results)) #<class 'tuple'>
# cursor.execute(sql)
# results = cursor.fetchone()
# print(results)  (1, 'wang', 12)
#6、关闭连接
conn.close()
print("查询数据成功")
#练习六:数据更新
# coding:utf-8
# 1、导入pymysql
import pymysql
#2、创建pymysql连接
conn = pymysql.connect(
    host='localhost',
    user='root',
    database='mycrawler',
    password='123456',
    port=3306
)
#3、获取游标
cursor = conn.cursor()
#4、准备要执行的sql语句:
sql = "update user set age = age+1"
#5、使用execute执行sql语句:
try:
    cursor.execute(sql)
    conn.commit()
except:
    #如果出现错误回滚
    conn.rollback()  
#6、关闭连接
conn.close()
print("数据更新成功")
#练习七:删除操作
# coding:utf-8
# 1、导入pymysql
import pymysql
#2、创建pymysql连接
conn = pymysql.connect(
    host='localhost',
    user='root',
    database='mycrawler',
    password='123456',
    port=3306
)
#3、获取游标
cursor = conn.cursor()
#4、准备要执行的sql语句:
sql = "delete from user where age>20"
#5、使用execute执行sql语句:
try:
    cursor.execute(sql)
    conn.commit()
except:
    #如果出现错误回滚
    conn.rollback()  
#6、关闭连接
conn.close()
print("数据删除成功")

错误处理;
异常 描述
Warning 当有严重警告时触发,例如插入数据是被截断等等。必须是 StandardError 的子类。
Error 警告以外所有其他错误类。必须是 StandardError 的子类。
InterfaceError 当有数据库接口模块本身的错误(而不是数据库的错误)发生时触发。 必须是Error的子类。
DatabaseError 和数据库有关的错误发生时触发。 必须是Error的子类。
DataError 当有数据处理时的错误发生时触发,例如:除零错误,数据超范围等等。 必须是DatabaseError的子类。
OperationalError 指非用户控制的,而是操作数据库时发生的错误。例如:连接意外断开、 数据库名未找到、事务处理失败、内存分配错误等等操作数据库是发生的错误。 必须是DatabaseError的子类。
IntegrityError 完整性相关的错误,例如外键检查失败等。必须是DatabaseError子类。
InternalError 数据库的内部错误,例如游标(cursor)失效了、事务同步失败等等。 必须是DatabaseError子类。
ProgrammingError 程序错误,例如数据表(table)没找到或已存在、SQL语句语法错误、 参数数量错误等等。必须是DatabaseError的子类。
NotSupportedError 不支持错误,指使用了数据库不支持的函数或API等。例如在连接对象上 使用.rollback()函数,然而数据库并不支持事务或者事务已关闭。 必须是DatabaseError的子类。

 

第二种 mysql-connector 驱动

安装mysql-connector
pip install mysql-connector

import mysql.connector
conn = mysql.connector.connect(
    host='localhost',
    user='root',
    password='123456',
    database='mycrawler',
    port=3306
)
print(conn)
#练习一:创建数据库
# 1、导入mysql.connector
import mysql.connector
# 2、创建mysql连接
conn = mysql.connector.connect(
    host='localhost',
    user='root',
    password='123456',
    port=3306
)
#3、获取游标
mycursor = conn.cursor()
# 4、使用execute执行sql语句:
mycursor.execute("CREATE DATABASE mysql_db")
print("创建数据库成功")
#练习二:创建数据表
# 1、导入mysql.connector
import mysql.connector
# 2、创建mysql连接
conn = mysql.connector.connect(
    host='localhost',
    user='root',
    password='123456',
    database="mysql_db",
    port="3306"
)
#3、获取游标
mycursor = conn.cursor()
sql="""CREATE TABLE IF NOT EXISTS `user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) NOT NULL,
      `age` int(11) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0"""
# 4、使用execute执行sql语句:
mycursor.execute(sql)
print("创建数据表成功")
#练习三:插入数据
# 1、导入mysql.connector
import mysql.connector
# 2、创建mysql连接
conn = mysql.connector.connect(
    host='localhost',
    user='root',
    password='123456',
    database="mysql_db",
    port="3306"
)
#3、获取游标
mycursor = conn.cursor()
sql = "INSERT INTO user (id, name, age) VALUES (%s, %s, %s)"
val = (1, "zhang",21)
# 4、使用execute执行sql语句:
mycursor.execute(sql,val)
# 5、数据表更新就需要commit
conn.commit() 
print("插入数据成功")
#练习四:批量插入数据
# 1、导入mysql.connector
import mysql.connector
# 2、创建mysql连接
conn = mysql.connector.connect(
    host='localhost',
    user='root',
    password='123456',
    database="mysql_db",
    port="3306"
)
#3、获取游标
mycursor = conn.cursor()
sql = "INSERT INTO user (id, name, age) VALUES (%s, %s, %s)"
val = [(2, "zhang",21),
      (3, "zhang",21),
      (4, "zang",21),
      (5, "zhang",21),
      (6, "zhang",21),
      (7, "zhang",21)
      ]
# 4、使用execute执行sql语句:
mycursor.executemany(sql,val)
# 5、数据表更新就需要commit
conn.commit() 
print(mycursor.rowcount, "记录插入成功。")
#练习五:查询数据
# 1、导入mysql.connector
import mysql.connector
# 2、创建mysql连接
conn = mysql.connector.connect(
    host='localhost',
    user='root',
    password='123456',
    database="mysql_db",
    port="3306"
)
#3、获取游标
mycursor = conn.cursor()
sql = "select * from user"
# 4、使用execute执行sql语句:
mycursor.execute(sql)
# 5、获取查询结果
results = mycursor.fetchall()  #获取所有记录
# results = mycursor.fetchone()  #只读取一条记录
for re in results:
    print(re)
#练习六:数据更新
# 1、导入mysql.connector
import mysql.connector
# 2、创建mysql连接
conn = mysql.connector.connect(
    host='localhost',
    user='root',
    password='123456',
    database="mysql_db",
    port="3306"
)
#3、获取游标
mycursor = conn.cursor()
sql = "update user set age = age+1"
# 4、使用execute执行sql语句:
mycursor.execute(sql)
# 5、提交到数据库执行
conn.commit()
print(mycursor.rowcount,"条记录被更改")
#练习七:删除操作
# 1、导入mysql.connector
import mysql.connector
# 2、创建mysql连接
conn = mysql.connector.connect(
    host='localhost',
    user='root',
    password='123456',
    database="mysql_db",
    port="3306"
)
#3、获取游标
mycursor = conn.cursor()
# 4、使用execute执行sql语句:
sql = "delete from user where name='zang'"
mycursor.execute(sql)
# 5、提交到数据库执行
conn.commit()
print(mycursor.rowcount,"条记录被更改")

 

posted on 2022-10-17 11:45  忆华灯纵博  阅读(125)  评论(0编辑  收藏  举报