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,"条记录被更改")
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
2017-10-17 【javascript】JS实例——鼠标操作
2017-10-17 【javascript】JS类型
2017-10-17 【javascript】JS类型——String
2017-10-17 【javascript】JS类型——Boolean
2017-10-17 【javascript】JS类型——Null
2017-10-17 【javascript】JS类型——Undefined
2017-10-17 【javascript】undefined null 0 false void(0) NaN 空字符串 比较