zoukankan      html  css  js  c++  java
  • Python3爬虫(九) 数据存储之关系型数据库MySQL

     Infi-chu:

    http://www.cnblogs.com/Infi-chu/

    关系型数据库
    关系型数据库是基于关系模型的数据库,而关系模型是通过二维表来保存的,所以关系型数据库的存储方式就是行列组成的表。
    每一列是一个字段,每一行是一条记录。
    表可以看成是摸个实体的集合,而实体之间存在关系,比如主键和外键
    常见的关系型数据库有:Oracle、MySQL、SQLite、SQL Server、DB2等

    MySQL
    在Python2中,MySQL的链接库是MySQLdb,

    而在Python3中,官方不支持使用MySQLdb,Python3中使用的是PyMySQL

    1.连接数据库

    import pymysql
    db = pymysql.connect(host='127.0.0.1',user='root',password='123456',port=3306)
    cursor=db.cursor()
    cursor.execute('SELETE VERSION()')    # 使用execute方法执行SQL语句
    data = cursor.fetchone()    # 使用fetchone()方法获得第一条数据
    print('Version is :',data)
    cursor.execute('CREATE DATABASE spiders DEFAULT CHARCTER SET uft-8')   # 创建spiders数据库,默认编码为UTF-8
    db.close()
    

    2.创建表

    import pymysql
    db = pymysql.connect(host='127.0.0.1',user='root',password='123456',port=3306,db='spiders')
    cursor = db.cursor()
    sql = 'CREATE TABLE IF NOT EXISTS tests (id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, age INT NOT NULL, PRIMARY KEY (id))'
    cursor.execute(sql)
    db.close()
    

    【注】
    在实际的爬虫项目中要根据实际情况设计数据库

    3.插入数据

    import pymysql
    id = '123'
    user = 'Infichu'
    age = 23
    db = pymysql.connect(host='127.0.0.1',user='root',password='123456',port=3306,db='spiders')
    cursor = db.cursor()
    sql = 'INSERT INTO tests(id,name,age) values(%s,%s,%s)'
    try:
        cursor.execute(sql,(id,user,age))
    	db.commit()    # commit()方法,数据库提交
    except:
        db.rollback()    # rollback(),数据库回滚
    db.close()
    

    事物的4个属性
    属性                                                                        描述
    原子性(atomicity)             事物是一个不可分割的工作单位,事物中包括的很多操作要么做,要么不做
    一致性(consistency)        事物必须使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的
    隔离性(isolation)              一个事物的执行不能被其他事物干扰
    持久性(durability)            持续性,一个事物一旦提交,他对数据库中数据的改变就应该是永久性的。之后的操作或故障不会对其造成影响

    # 通用插入方法
    import pymysql
    data = {
    'id':'1',
    'name':'Infi-chu',
    'age':23
    }
    table = 'tests'
    keys = ', '.join(data.keys())
    values = ', '.join(['%s'*len(data)])
    sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table,keys=keys,values=values)
    try:
        if cursor.execute(sql,tuple(data.values())):
    	print('Successful')
    except:
        print('Failed')
    	db.rollback()
    db.close()
    

    4.更新数据

    sql = 'UPDATE tests SET age=%s WHERE name=%s'
    try:
        cursor.execute(sql,(25,'Infi-chu'))
    	db.commit()
    except:
        db.rollback()
    db.close()

    # 通用更新方法
    import pymysql
    data = {
    'id':'1',
    'name':'Infi-chu',
    'age':23
    }
    table = 'tests'
    keys = ', '.join(data.keys())
    values = ', '.join(['%s']*len(data))
    # ON DUPLICATE KEY UPDATE 表示如果主键已经存在,就执行更新操作
    sql = 'INSERT INTO {table}({keys}) VALUES ({values}) ON DUPLICATE KEY UPDATE'.format(table=table,keys=keys,values=values)
    update = ','.join([" {keys}=%s".format(key=key) for key in data])
    sql += update
    try:
    if cursor.execute(sql,tuple(data.values())*2):
    print('Successful')
    db.commit()
    except:
    print('Failed')
    db.rollback()
    db.close()

    5.删除数据:

    table = 'tests'
    condition = 'age>20'
    sql = 'DELETE FROM {table} WHERE {condition}'.format(table=table,condition=condition)
    try:
        cursor.execute(sql)
    	db.commit()
    except:
    	cursor.rollback()
    db.close()
    

    6.查询数据:

    sql = 'SELECT * FROM tests WHERE age>=20'
    try:
        cursor.execute(sql)
    	print('Count:',cursor.rowcount)
    	one = cursor.fetchone()
    	print('One:',one)
    	results = cursor.fetchall()
    	print('Results:',results)
    	print('Results Type:',type(results))
    	for row in results:
    	    print(row)
    except:
        print('Error')
  • 相关阅读:
    centos linux系统日常管理3 服务管理ntsysv,chkconfig,系统日志rsyslog,last ,lastb ,exec,xargs,dmesg,screen,nohup,curl,ping ,telnet,traceroute ,dig ,nc,nmap,host,nethogs,base64,jq 第十六节课
    centos Linux系统日常管理2 tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课
    一个兼职DBA的数据库运维经验 小米科技 xx@xiaomi.com 2011
    centos Linux系统日常管理1 cpuinfo cpu核数 命令 w, vmstat, uptime ,top ,kill ,ps ,free,netstat ,sar, ulimit ,lsof ,pidof 第十四节课
    HTML5矢量实现文件上传进度条
    基于HTML5的WebGL呈现A星算法3D可视化
    基于HTML5的WebGL呈现A星算法的3D可视化
    基于HTML5的WebGL设计汉诺塔3D游戏
    基于HTML5树组件延迟加载技术实现
    基于HTML5的WebGL电信网管3D机房监控应用
  • 原文地址:https://www.cnblogs.com/Infi-chu/p/8979673.html
Copyright © 2011-2022 走看看