pymysql读写数据

107 阅读1分钟

使用pymysql对数据库进行读写操作,使用原生SQL处理数据。

一 数据库配置,用于对数据库进行读写

from itertools import chain
import pymysql
import os, time
import logger

#日志文件
log_path = os.path.abspath(os.path.dirname(__file__)) + '/log/news%s.log' % time.strftime('%Y%m%d')
logging = logger.log_conf('news', log_path)

class News():
    def __init__(self):
        self.db = pymysql.connect(
            host=host,
            port=port,
            user=user,
            passwd=passwd,
            database=database,
            charset=charset
        )
        
    def get_insert(self,item):
        name = item['name']
        id = item['id']
        url = item['url']
        # 创建游标
        cursor = self.db.cursor()
        # SQL 插入语句,存在插入,不存在更新
        sql = "INSERT INTO {}(name, id, url) VALUES (%s,%s,%s)ON DUPLICATE KEY UPDATE url = VALUES(url), update_time = CURRENT_TIMESTAMP".format('table_name')
        try:
            # 执行sql语句
            cursor.execute(sql, [name, id, url])
            # 提交到数据库执行
            self.db.commit()
            logging.info("账号写入成功:{},名称:{}".format(name, id))
        except Exception as e:
            # 如果发生错误则回滚
            logging.info("写入失败,数据回滚{}".format(e))
            self.db.rollback()
        finally:
            # 关闭数据库连接
            self.db.close()

    def get_search(self):
        cur = self.db.cursor()
      
        sql = "SELECT name,id FROM {} WHERE is_update>0 ".format('table_name')
          # 1.查询操作(按时间查找,今天的)
        #sql = "SELECT name,id,url FROM {}  where to_days(create_time) = to_days(now())".format('table_name')
        try:
            cur.execute(sql)  # 执行sql语句
            results = cur.fetchall()  # 获取查询的所有记录
            #用chain将查询结果转化成list
            resultlist = list(chain.from_iterable(results))
            return resultlist
        except Exception as e:
            logging.info("查询错误{}".format(e))
            raise e
        finally:
            self.db.close()  # 关闭连接

if __name__ == '__main__':
    pass

二 对数据库进行读写

import database
def get_search():
     #读取数据库
    a = database.News().get_search()
    # 查询2个字段n为2
    n = 2
     #a是一个列表包含多个字段,
    for r in [a[i:i + n] for i in range(0, len(a), n)]:
        item = {}
        item['name'] = r[0]
        item['id'] = r[1]
        item['url']='https://www.baidu.com/{}'.format(r[1])
        print(item)
        # 写入数据库  
        database.News().get_insert(item)
 get_search()

三 创建数据表

CREATE TABLE `table` (
  `id` bigint(64) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `name` varchar(200) NOT NULL DEFAULT '' COMMENT '名称',
  `code_id` varchar(500) NOT NULL DEFAULT '' COMMENT '唯一id',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `type` varchar(10) DEFAULT NULL COMMENT '数据类型',
  `url` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `uniq_trueId` (`code_id`) USING BTREE
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COMMENT='test'