使用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'