• 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,"条记录被更改")
  • 相关阅读:
    负载均衡,分布式,集群的理解,多台服务器代码如何同步
    浅谈控制反转与依赖注入
    Jetbrains系列产品重置试用方法
    讲述一下一个还没毕业的科班程序猿的求职历程
    一个在求职路上挣扎的萌新
    用C#操作文件/文件夹(删除,复制,移动)
    随笔-关于公网IP无法访问服务器的解决办法
    C/s从文件(TXT)中读取数据插入数据库
    Sql Server + ADO.NET
    进程。线程与线程池
  • 原文地址:https://www.cnblogs.com/Horsonce/p/16798687.html
Copyright © 2020-2023  润新知