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

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

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

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

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

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

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

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

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

  4. Python3.x:pyodbc连接Sybase数据库操作(Windows系统下DNS模式)

    Python3.x:pyodbc连接Sybase数据库操作(Windows系统下DNS模式) 一.安装模块pyodbc pip install pyodbc 二.配置odbc数据源 (1).windo ...

  5. 通过MyEclipse工具直接操作数据库,执行sql语句,方便快捷

    原文:通过MyEclipse工具直接操作数据库,执行sql语句,方便快捷 通过MyEclipse操作数据库,执行sql语句使我们不用切换多个工具,直接工作,方便快捷.效果如下: 步骤1:通过MyEcl ...

  6. 通过MyEclipse操作数据库,执行sql语句使我们不用切换多个工具,直接工作,方便快捷

    通过MyEclipse操作数据库,执行sql语句使我们不用切换多个工具,直接工作,方便快捷.效果如下:     步骤1:通过MyEclipse中的window->show View->ot ...

  7. 【转载】 Sqlserver查看数据库死锁的SQL语句

    在Sqlsever数据库中,有时候操作数据库过程中会进行锁表操作,在锁表操作的过程中,有时候会出现死锁的情况出现,这时候可以使用SQL语句来查询数据库死锁情况,主要通过系统数据库Master数据库来查 ...

  8. 在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计、SQL语句、java等层面的解决方案。

    在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计.SQL语句.java等层面的解决方案. 解答: 1)数据库设计方面: a. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 whe ...

  9. Oracle数据库常用的Sql语句整理

    Oracle数据库常用的Sql语句整理 查看当前用户的缺省表空间 : select username,default_tablespace from user_users; 2.查看用户下所有的表 : ...

随机推荐

  1. php学习七:时间和日期

    在学习php中的时间和日期的时候,必须要了解什么是时间戳,那么什么是时间戳呢,请看一下的定义 时间戳:从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数 ...

  2. MQTT的学习研究(十)【转】mosquitto——一个开源的mqtt代理

    MQTT(MQ Telemetry Transport),消息队列遥测传输协议,轻量级的发布/订阅协议,适用于一些条件比较苛刻的环境,进行低带宽.不可靠或间歇性的通信.值得一提的是mqtt提供三种不同 ...

  3. bigpipe&bigrender

    bigpipe: 先输出页面的整体布局,在按块输出输出页面的每个部分.这样可以让服务器的运算.网络的传输和浏览器的渲染并行.适用于服务器运算较慢的时候. bigrender: 主要在浏览器端,先将字符 ...

  4. 如何判断SharedPreferences 记录存在

    private EditText et; private String ettext; SharedPreferences settings; Editor editor; //设置 settings ...

  5. OC开发_Storyboard——绘制和视图

    1.绘制 不要调用drawRect.调用setNeedsDisplay相当于告知系统视图需要重绘, 它会去调用drawRect,更新屏外缓冲器 2.UIBezierPath绘制图形,   设置图像op ...

  6. php程序中判断session过期

    我们最常用的是在php程序中设置,如下例程序所示: if(!isset($_SESSION['abc']) || time()-$_SESSION['abc']>60){ $_SESSION[' ...

  7. Groovy中的面向对象

    Groovy中的面向对象 前面说到groovy支持脚本和类,前面一节已将简单说了脚本和类之间的关系,这一节主要介绍一下groovy中类的相关知识,即面向对象相关知识. 1.类型 1.1 原始类型 gr ...

  8. poj1185 炮兵阵地【状压DP】

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 32802   Accepted: 12650 Descriptio ...

  9. 云备份厂商Rubrik再获2.61亿美元融资,估值高达33亿美元 转自中国存储网

    数据管理初创公司Rubrik在Bain Capital Ventures领导的最新一轮融资中筹集了2.61亿美元,估值为33亿美元. 现有的利益相关者 - Lightspeed Venture Par ...

  10. django如何防止csrf(跨站请求伪造)

    什么是CSRF 下面这张图片说明了CSRF的攻击原理: Django中如何防范CSRF Django使用专门的中间件(CsrfMiddleware)来进行CSRF防护.具体的原理如下: 1.它修改当前 ...