Python3:sqlalchemy对mysql数据库操作,非sql语句

  1. # python3
  2. # author lizm
  3. # datetime 2018-02-01 10:00:00
  4. # -*- coding: utf-8 -*-
  5. '''
  6. 数据起始日期:2015-05-08
  7. 数据库:mysql
  8. '''
  9. import requests
  10. from bs4 import BeautifulSoup
  11. import json
  12. import pymysql
  13. import datetime
  14. import time
  15. import sys
  16. import logging
  17. from selenium import webdriver
  18. from sqlalchemy import Column,Integer, String,DateTime,create_engine
  19. from sqlalchemy.orm import sessionmaker
  20. from sqlalchemy.ext.declarative import declarative_base
  21. from sqlalchemy import and_,func
  22. import configparser
  23. import math
  24.  
  25. logger = logging.getLogger()
  26. #set loghandler
  27. file = logging.FileHandler(sys.path[0]+"\py_zgjs_log"+time.strftime("%Y%m%d")+".log")
  28. logger.addHandler(file)
  29. #set formater
  30. formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s")
  31. file.setFormatter(formatter)
  32. #set log level
  33. logger.setLevel(logging.NOTSET)
  34.  
  35. # 创建对象的基类:
  36. Base = declarative_base()
  37.  
  38. class Yztzzqktjb(Base):
  39.  
  40. # 表名
  41. __tablename__ = 'py_zgjs_yztzzqktjb'
  42.  
  43. # 表结构
  44. id = Column(Integer,primary_key=True,autoincrement=True)
  45. mc = Column(String(200),nullable=False)
  46. begindate = Column(String(45),nullable=False)
  47. enddate = Column(String(45), nullable=False)
  48. sjmc = Column(String(200))
  49. ssjmc = Column(String(200))
  50. sl = Column(String(45))
  51. create_time = Column(DateTime,nullable=False)
  52. update_time = Column(DateTime,nullable=False)
  53.  
  54. def __init__(self,mc,begindate,enddate,sjmc,ssjmc,sl,create_time,update_time):
  55. self.mc = mc
  56. self.begindate = begindate
  57. self.enddate = enddate
  58. self.sjmc = sjmc
  59. self.ssjmc = ssjmc
  60. self.sl = sl
  61. self.create_time = create_time
  62. self.update_time = update_time
  63.  
  64. class ZgjsEntry(object):
  65.  
  66. def __init__(self, v1, v2,v3,v4,v5,v6):
  67. self.v1 = v1
  68. self.v2 = v2
  69. self.v3 = v3
  70. self.v4 = v4
  71. self.v5 = v5
  72. self.v6 = v6
  73.  
  74. def __get__(self, instance, cls):
  75. if instance is None:
  76. return self
  77. else:
  78. return instance.__dict__[self.name]
  79.  
  80. def __set__(self, instance, value):
  81. instance.__dict__[self.name] = value
  82.  
  83. def __delete__(self, instance):
  84. del instance.__dict__[self.name]
  85.  
  86. def dbconfig():
  87. #生成config对象
  88. cfg = configparser.ConfigParser()
  89. #用config对象读取配置文件
  90. path_ = sys.path[0]
  91. cfg.read(path_+"\dbconfig.ini")
  92. ip = cfg.get("dbserver", "ip")
  93. port = cfg.get("dbserver", "port")
  94. user = cfg.get("dbserver", "user")
  95. password = cfg.get("dbserver", "password")
  96. dbname = cfg.get("dbserver", "dbname")
  97. endtime = cfg.get("dbtime", "endtime")
  98. initdate = cfg.get("dbtime", "mzkbinitdate")
  99. interval = cfg.get("dbtime", "interval")
  100. return (ip,port,user,password,dbname,endtime,initdate,interval)
  101.  
  102. def savrData(tableName,zgjsList):
  103. msgcode = 0
  104. message = '数据保存成功'
  105. try:
  106. dbcfg = dbconfig()
  107. # 初始化数据库连接,
  108. # 传入参数:数据库类型+连接库+用户名+密码+主机,字符编码,是否打印建表细节
  109. engine = create_engine('mysql+mysqlconnector://'+dbcfg[2]+':'+dbcfg[3]+'@'+dbcfg[0]+':'+dbcfg[1]+'/'+dbcfg[4],encoding='utf-8')
  110. # 创建DBSession类型:
  111. DBSession = sessionmaker(bind=engine)
  112. session = DBSession()
  113. try:
  114. # 增操作
  115. items = []
  116. if tableName == 'Yztzzqktjb':
  117. if len(zgjsList)>0:
  118. for i in range(0,len(zgjsList)):
  119. results = session.query(Yztzzqktjb).filter(and_(Yztzzqktjb.mc == zgjsList[i].v1,Yztzzqktjb.begindate == zgjsList[i].v2,Yztzzqktjb.enddate==zgjsList[i].v3,Yztzzqktjb.sjmc==zgjsList[i].v4,Yztzzqktjb.ssjmc==zgjsList[i].v5)).all()
  120. if len(results) > 0:
  121. session.query(Yztzzqktjb).filter(and_(Yztzzqktjb.mc == zgjsList[i].v1,Yztzzqktjb.begindate == zgjsList[i].v2,Yztzzqktjb.enddate==zgjsList[i].v3,Yztzzqktjb.sjmc==zgjsList[i].v4,Yztzzqktjb.ssjmc==zgjsList[i].v5)).update({Yztzzqktjb.sl: zgjsList[i].v6,Yztzzqktjb.update_time:time.strftime('%Y-%m-%d %H:%M:%S')}, synchronize_session=False)
  122. else:
  123. item = Yztzzqktjb(mc=zgjsList[i].v1,begindate=zgjsList[i].v2,enddate=zgjsList[i].v3,sjmc=zgjsList[i].v4,ssjmc=zgjsList[i].v5,sl=zgjsList[i].v6,create_time=time.strftime('%Y-%m-%d %H:%M:%S'),update_time=time.strftime('%Y-%m-%d %H:%M:%S'))
  124. items.append(item)
  125. else:
  126. pass
  127. #print("len(items)>>>>>%s" %len(items))
  128. if len(items) > 0:
  129. for i in range(0,len(items)):
  130. session.add(items[i])
  131. #提交数据
  132. session.commit()
  133. except Exception as e:
  134. msgcode = 1
  135. message = '数据保存失败' + str(e)
  136. session.rollback()
  137. finally:
  138. #关闭
  139. session.close()
  140. except Exception as e:
  141. msgcode = 1
  142. message = '数据库连接失败'+str(e)
  143. logger.info(message)
  144. print(message)
  145. return msgcode
  146.  
  147. def getData(jsDate, channelIdStr,tableName):
  148. zgjsList = []
  149. dateStr = jsDate[0:4]+'.'+jsDate[5:7]+'.'+jsDate[8:10]
  150. # 查询按钮跳转url:
  151. # http://www.******.cn/cms-search/view.action?action=china
  152. url = "http://www.******.cn/cms-search/view.action?action=china"
  153. headerDict = {'Host': 'www.*******.cn',
  154. 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.31 Safari/537.36',
  155. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
  156. 'Accept-Language': 'zh-CN,zh;q=0.8',
  157. 'Accept-Encoding': 'gzip, deflate',
  158. 'Referer': 'http://www.******.cn/cms-search/view.action?action=china',
  159. 'Connection': 'keep-alive'}
  160. data = {'dateType': '', 'dateStr': dateStr,
  161. 'channelIdStr': channelIdStr}
  162. # psot 传递参数
  163. res = requests.post(url, data=data, headers=headerDict)
  164. # 获取跳转后的页面源码
  165. soup = BeautifulSoup(res.content, "html.parser")
  166. #获取周报的起始日期
  167. SettlementTitle = soup.find('div',class_='SettlementTitle')
  168. if SettlementTitle is None:
  169. return zgjsList
  170. h2 = SettlementTitle.find('h2').text
  171. if h2 == '搜索结果':
  172. return zgjsList
  173. weekdate = h2.strip().split('(')[1].split(')')[0]
  174. begindate = weekdate.split('-')[0].replace('.','-')
  175. enddate = weekdate.split('-')[1].replace('.','-')
  176.  
  177. settlementList = soup.find(id='settlementList')
  178. # print(settlementList)
  179. if settlementList is None:
  180. return zgjsList
  181. if settlementList.find('table') is None:
  182. return zgjsList
  183.  
  184. table_ = settlementList.find('table')
  185. tr_list = table_.find('table').find_all('tr')
  186. # 上级名称
  187. sjmc_1 = ''
  188. sjmc_2 = ''
  189. sjmc_3 = ''
  190. sjmc_4 = ''
  191. sjmc_5 = ''
  192. sjmc_6 = ''
  193. # 上上级名称
  194. ssjmc_1 = ''
  195. for n in range(1,len(tr_list)):
  196. td_list = tr_list[n].find_all('td')
  197. if tableName == 'Yztzzqktjb':
  198. if n == 1:
  199. sjmc_1 = td_list[0].get_text().replace('一、','').strip()
  200. if n == 4:
  201. sjmc_2 = td_list[0].get_text().replace('二、','').strip()
  202. ssjmc_1 = td_list[0].get_text().replace('二、','').strip()
  203. if n == 5:
  204. sjmc_3 = td_list[0].get_text().replace('1、','').strip()
  205. if n == 9:
  206. sjmc_4 = td_list[0].get_text().replace('2、','').strip()
  207. if n == 13:
  208. sjmc_5 = td_list[0].get_text().replace('三、','').strip()
  209. if n == 17:
  210. sjmc_6 = td_list[0].get_text().replace('四、','').strip()
  211.  
  212. if tableName == 'Yztzzqktjb':
  213. if n in (6,10,14,18):
  214. continue
  215. zgjs = ZgjsEntry('','','','','','')
  216. zgjs.v2 = begindate
  217. zgjs.v3 = enddate
  218.  
  219. if tableName == 'Yztzzqktjb':
  220. # 上级名称
  221. if n in (2,3):
  222. zgjs.v4 = sjmc_1
  223. if n in (5,9):
  224. zgjs.v4 = sjmc_2
  225. if n in (7,8):
  226. zgjs.v4 = sjmc_3
  227. zgjs.v5 = ssjmc_1
  228. if n in (11,12):
  229. zgjs.v4 = sjmc_4
  230. zgjs.v5 = ssjmc_1
  231. if n in (15,16):
  232. zgjs.v4 = sjmc_5
  233. if n in (19,20):
  234. zgjs.v4 = sjmc_6
  235. for i in range(0,len(td_list)):
  236. if i == 0:
  237. zgjs.v1 =td_list[i].get_text().replace('一、','').replace('二、','').replace('三、','').replace('四、','').replace('1、','').replace('2、','').strip()
  238. if i == 1:
  239. zgjs.v6 =td_list[i].get_text().strip().replace(',','')
  240. if zgjs is not None:
  241. zgjsList.append(zgjs)
  242. return zgjsList
  243.  
  244. # 获取开始日期:
  245. def getBeginDate(bgdate,tableName):
  246. r_date = bgdate
  247. try:
  248. dbcfg = dbconfig()
  249. # 初始化数据库连接,
  250. # 传入参数:数据库类型+连接库+用户名+密码+主机,字符编码,是否打印建表细节
  251. engine = create_engine('mysql+mysqlconnector://'+dbcfg[2]+':'+dbcfg[3]+'@'+dbcfg[0]+':'+dbcfg[1]+'/'+dbcfg[4],encoding='utf-8')
  252. # 创建DBSession类型:
  253. DBSession = sessionmaker(bind=engine)
  254. session = DBSession()
  255. try:
  256. if tableName == 'Yztzzqktjb':
  257. results = session.query(func.max(Yztzzqktjb.enddate)).all()
  258. if len(results) != 0:
  259. r_date = results[0]
  260. else:
  261. pass
  262. except Exception as e:
  263. print('获取开始日期,查询异常;%s'%str(e))
  264. logger('获取开始日期,查询异常;%s'%str(e))
  265. session.rollback()
  266. finally:
  267. #关闭
  268. session.close()
  269. except Exception as e:
  270. print('获取开始日期,数据库连接失败;%s'%str(e))
  271. logger('获取开始日期,数据库连接失败;%s'%str(e))
  272. if r_date[0] is None:
  273. r_date = bgdate
  274. else:
  275. begin = time.strptime(r_date[0], "%Y-%m-%d")
  276. y,m,d = begin[0:3]
  277. r_date = datetime.date(y,m,d) + datetime.timedelta(days=7)
  278. r_date = r_date .strftime('%Y-%m-%d')
  279. return r_date
  280.  
  281. def isCheckData(date_):
  282. r_code = 0
  283. try:
  284. dbcfg = dbconfig()
  285. # 初始化数据库连接,
  286. # 传入参数:数据库类型+连接库+用户名+密码+主机,字符编码,是否打印建表细节
  287. engine = create_engine('mysql+mysqlconnector://'+dbcfg[2]+':'+dbcfg[3]+'@'+dbcfg[0]+':'+dbcfg[1]+'/'+dbcfg[4],encoding='utf-8')
  288. # 创建DBSession类型:
  289. DBSession = sessionmaker(bind=engine)
  290. session = DBSession()
  291. try:
  292. #
  293. results = session.query(Yztzzqktjb).filter(and_(func.datediff(Yztzzqktjb.enddate,date_)<6,func.datediff(Yztzzqktjb.enddate,date_)>-2)).all()
  294. if len(results) == 0:
  295. r_code = 1
  296. else:
  297. r_code = 0
  298. except Exception as e:
  299. r_code = 1
  300. print('判断是否有数据异常;%s'%str(e))
  301. logger('判断是否有数据异常;%s'%str(e))
  302. session.rollback()
  303. finally:
  304. #关闭
  305. session.close()
  306. except Exception as e:
  307. r_code = 1
  308. print('判断是否有数据,数据库连接异常;%s'%str(e))
  309. logger('判断是否有数据,数据库连接异常;%s'%str(e))
  310. return r_code
  311.  
  312. # 执行入口
  313. def main(initdate_):
  314. req_list = [
  315. {'report':'6ac54ce22db4474abc234d6edbe53ae7','table':'Yztzzqktjb'}
  316. ]
  317. for req in req_list:
  318. #字符转日期
  319. begin = time.strptime(getBeginDate(initdate_,req['table']), "%Y-%m-%d")
  320. y,m,d = begin[0:3]
  321. #日期格式:2018-01-18
  322. begin = datetime.date(y,m,d)
  323. #获取当前日期
  324. end = datetime.date.today()
  325. if (end- begin).days < 0:
  326. pass
  327. else:
  328. for i in range(math.ceil((end - begin).days/7)+1):
  329. list_szzj = []
  330. # 日期转字符
  331. date_ = (begin+datetime.timedelta(days=i*7)).strftime('%Y-%m-%d')
  332. list_mzkb = getData(date_,req['report'],req['table'])
  333. if len(list_mzkb):
  334. savrData(req['table'],list_mzkb)
  335. else:
  336. pass
  337. time.sleep(0.5)
  338. if i % 350 == 0:
  339. time.sleep(15)
  340.  
  341. if __name__ == '__main__':
  342. vrg_date = ''
  343. dbcfg = dbconfig()
  344. vrg_endtime = dbcfg[5][0:2]+":"+dbcfg[5][2:4]+":"+dbcfg[5][4:6]
  345. var_initdate = dbcfg[6][0:4]+"-"+dbcfg[6][4:6]+"-"+dbcfg[6][6:8]
  346. var_interval = int(dbcfg[7])
  347.  
  348. if len(vrg_date) ==8:
  349. vrg_date = str(vrg_date[0:4]) + "-" + str(vrg_date[4:6]) + "-" + str(vrg_date[6:8])
  350. end_time = time.strptime(vrg_endtime, "%H:%M:%S")
  351. y,m,d = end_time[3:6]
  352. end_time = datetime.time(y,m,d)
  353. # 循环采集
  354. while True:
  355. now_time = time.strftime("%H%M%S")
  356. main(var_initdate)
  357. if isCheckData(vrg_date,) == 0:
  358. logger.info("采集数据结束")
  359. print("采集数据结束")
  360. break
  361. # 时间到停止采集
  362. if int(end_time.strftime('%H%M%S')) - int(now_time) <= 0:
  363. logger.info("采集数据结束")
  364. print("采集数据结束")
  365. break
  366. # 间隔执行时间
  367. logger.info("**********************(%s):没有采集到数据,任务继续执行**********************" %vrg_date)
  368. print("********************(%s):没有采集到数据,任务继续执行**********************" %vrg_date)
  369. time.sleep(var_interval)
  370. else:
  371. logger.info("日期参数格式不正确,请用格式:20180205")
  372. print("日期参数格式不正确,请用格式:20180205")

Python3:sqlalchemy对mysql数据库操作,非sql语句的更多相关文章

  1. python3中的mysql数据库操作

    软硬件环境 OS X EI Capitan Python 3.5.1 mysql 5.6 前言 在开发中经常涉及到数据库的使用,而python对于数据库也有多种解决方法.本文以python3中的mys ...

  2. python sqlalchemy 进行 mysql 数据库操作

    1. 进行mysql数据库的创建,如果已经存在,就相当于进行数据库的连接操作 from sqlalchemy import create_engine from sqlalchemy.ext.decl ...

  3. MySQL数据库基本操作以及SQL语句

    连接mysql的语法 mysql -u用户名 -p密码 [-h主机名] [-P端口号] 在一个mysql服务器中, 可以有多个mysql数据库(本质是一个文件夹) 在一个mysql数据库中, 可以有多 ...

  4. mysql数据库之基础SQL语句/语法

    SQL是现在进入互联网工作人们的必须技能之一,下面分享自己觉得很nice的SQL基本语句,从网上找了,觉得很不错,就分享给大家!简要介绍基础语句: 1.说明:创建数据库  Create DATABAS ...

  5. MySQl数据库必会sql语句加强版

    这篇承接上一篇<mysql必会sql语句>:http://blog.csdn.net/qq_32059827/article/details/51763950 这一篇属于加强版,问题和sq ...

  6. django 快速数据库操作,不用SQL语句

    配置models文件 # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import mod ...

  7. Delphi XE8中开发DataSnap程序常见问题和解决方法 (二)想对DBExpress的TSQLDataSet写对数据库操作的SQL语句出错了!

    当我们搞定DataSnap后,我们进入客户端程序开发阶段了,我们建立了客户端模块后,打算按照刚才开发服务器的步骤开发客户端程序,随后加入了DBExpress的TSQLDataSet,设定数据库连接后, ...

  8. Python3:sqlalchemy对sybase数据库操作,非sql语句

    Python3:sqlalchemy对sybase数据库操作,非sql语句 # python3 # author lizm # datetime 2018-02-01 10:00:00 # -*- c ...

  9. mysql数据库批量执行sql文件对数据库进行操作【windows版本】

    起因: 因工作需要,在本机测试环境升级mysql数据库,需逐条执行mysql数据库的sql文件对数据库进行升级,因此找了些关于mysql的文章,对批量升级数据库所需的sql文件进行升级. 整理思路: ...

随机推荐

  1. PyQt4关闭窗口

    一个显而易见的关闭窗口的方式是但集标题兰有上角的X标记.接下来的示例展示如何用代码来关闭程序,并简要介绍Qt的信号和槽机制. 下面是QPushButton的构造函数,我们将会在下面的示例中使用它. Q ...

  2. 谷歌Volley网络框架讲解——网络枢纽

    研究了这么久的Volley,愈来愈发现这个框架的精美和人性化.比起民间一些框架强很多,一开始总是盲人摸象找不到头绪,现在终于有些明朗了.Volley其实就是一个请求队列的代理类,我们看下UML. 这就 ...

  3. c++11实现optional

    optional< T> c++14中将包含一个std::optional类,optional< T>内部存储空间可能存储了T类型的值也可能没有存储T类型的值.当optiona ...

  4. JS-运动基础——案例应用:淡入淡出效果

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. JS-提取字符串—>>普通方法VS正则表达式

    如下:“23nr qreq2 34fq4 4454gsr 45” [将这一串字符中的数字挑出来,当然人家作伴的不能被分开]. 一.普通方法: <script type="text/ja ...

  6. 日请求亿级的QQ会员AMS平台PHP7升级实践

    版权声明:本文由PHP7升级项目组原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/74 来源:腾云阁 https://www ...

  7. CentOS6.8系统安装Oracle11g

    1.官网上下载 软件安装包: linux.x64_11gR2_database_1of2.zip linux.x64_11gR2_database_2of2.zip 解压后: 生成文件夹: datab ...

  8. 大规模网站sesson会话保持思路及实践配置

    1.需求: 请教个问题:我用lvs的rr模式,(考虑过 ipvsadm -p,但是这样就失去了负载均衡的意义感觉),后端有10台web,用一台memcached专门用于存储session文件,但是现在 ...

  9. python环境杂谈

    最近发现集群里的服务器上有多个python环境,版本相同的python也有多个,主要区别是site-packages里安装的模块不同,这样配置的好处是不同类型的项目可以使用自己的python环境,不会 ...

  10. 用 Fiddler查看 Android 网络请求

    1. 下载安装 fiddler,尽量到官方网站找最新的版本 备注:安装后,打开的时候如果报错: Machine-wide Progress Telerik Fiddler installation h ...