Python3:sqlalchemy对sybase数据库操作,非sql语句
Python3:sqlalchemy对sybase数据库操作,非sql语句
- # python3
- # author lizm
- # datetime 2018-02-01 10:00:00
- # -*- coding: utf-8 -*-
- '''
- 数据起始日期:2015-05-08
- 数据库:sybase,
- 表名:t_wlpc_zgjs_yztzzqktjb
- '''
- import requests
- from bs4 import BeautifulSoup
- import json
- import pyodbc
- import datetime
- import time
- import sys
- import logging
- from selenium import webdriver
- from sqlalchemy import Column,Integer, String,DateTime,create_engine
- from sqlalchemy.orm import sessionmaker
- from sqlalchemy.ext.declarative import declarative_base
- from sqlalchemy import and_,func
- import configparser
- import math
- logger = logging.getLogger()
- #set loghandler
- file = logging.FileHandler(sys.path[0]+"\py_zgjs_log"+time.strftime("%Y%m%d")+".log")
- logger.addHandler(file)
- #set formater
- formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s")
- file.setFormatter(formatter)
- #set log level
- logger.setLevel(logging.NOTSET)
- # 创建对象的基类:
- Base = declarative_base()
- class Yztzzqktjb(Base):
- # 表名
- __tablename__ = 't_wlpc_zgjs_yztzzqktjb'
- # 表结构
- id = Column(Integer,primary_key=True,autoincrement=True)
- mc = Column(String(200),nullable=False)
- begindate = Column(String(45),nullable=False)
- enddate = Column(String(45), nullable=False)
- sjmc = Column(String(200))
- ssjmc = Column(String(200))
- sl = Column(String(45))
- create_time = Column(DateTime,nullable=False)
- update_time = Column(DateTime,nullable=False)
- def __init__(self,mc,begindate,enddate,sjmc,ssjmc,sl,create_time,update_time):
- self.mc = mc
- self.begindate = begindate
- self.enddate = enddate
- self.sjmc = sjmc
- self.ssjmc = ssjmc
- self.sl = sl
- self.create_time = create_time
- self.update_time = update_time
- class ZgjsEntry(object):
- def __init__(self, v1, v2,v3,v4,v5,v6):
- self.v1 = v1
- self.v2 = v2
- self.v3 = v3
- self.v4 = v4
- self.v5 = v5
- self.v6 = v6
- def __get__(self, instance, cls):
- if instance is None:
- return self
- else:
- return instance.__dict__[self.name]
- def __set__(self, instance, value):
- instance.__dict__[self.name] = value
- def __delete__(self, instance):
- del instance.__dict__[self.name]
- def dbconfig():
- #生成config对象
- cfg = configparser.ConfigParser()
- #用config对象读取配置文件
- path_ = sys.path[0]
- cfg.read(path_+"\dbconfig.ini")
- dns = cfg.get("dbsybase", "dns")
- user = cfg.get("dbsybase", "user")
- password = cfg.get("dbsybase", "password")
- endtime = cfg.get("dbtime", "endtime")
- initdate = cfg.get("dbtime", "mzkbinitdate")
- interval = cfg.get("dbtime", "interval")
- return (dns,user,password,endtime,initdate,interval)
- def savrData(tableName,zgjsList):
- msgcode = 0
- message = '数据保存成功'
- try:
- dbcfg = dbconfig()
- # 初始化数据库连接,
- engine = create_engine('sybase+pyodbc://'+dbcfg[1]+':'+dbcfg[2]+'@'+dbcfg[0])
- # 创建DBSession类型:
- DBSession = sessionmaker(bind=engine)
- session = DBSession()
- try:
- # 增操作
- items = []
- if tableName == 'Yztzzqktjb':
- if len(zgjsList)>0:
- for i in range(0,len(zgjsList)):
- 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()
- if len(results) > 0:
- 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)
- else:
- 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'))
- items.append(item)
- else:
- pass
- #print("len(items)>>>>>%s" %len(items))
- if len(items) > 0:
- for i in range(0,len(items)):
- session.add(items[i])
- #提交数据
- session.commit()
- except Exception as e:
- msgcode = 1
- message = '数据保存失败' + str(e)
- session.rollback()
- finally:
- #关闭
- session.close()
- except Exception as e:
- msgcode = 1
- message = '数据库连接失败'+str(e)
- logger.info(message)
- print(message)
- return msgcode
- def getData(jsDate, channelIdStr,tableName):
- zgjsList = []
- dateStr = jsDate[0:4]+'.'+jsDate[5:7]+'.'+jsDate[8:10]
- # 查询按钮跳转url:
- # http://www.******.cn/cms-search/view.action?action=china
- url = "http://www.******.cn/cms-search/view.action?action=china"
- headerDict = {'Host': 'www.******.cn',
- 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.31 Safari/537.36',
- 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
- 'Accept-Language': 'zh-CN,zh;q=0.8',
- 'Accept-Encoding': 'gzip, deflate',
- 'Referer': 'http://www.******.cn/cms-search/view.action?action=china',
- 'Connection': 'keep-alive'}
- data = {'dateType': '', 'dateStr': dateStr,
- 'channelIdStr': channelIdStr}
- # psot 传递参数
- res = requests.post(url, data=data, headers=headerDict)
- # 获取跳转后的页面源码
- soup = BeautifulSoup(res.content, "html.parser")
- #获取周报的起始日期
- SettlementTitle = soup.find('div',class_='SettlementTitle')
- if SettlementTitle is None:
- return zgjsList
- h2 = SettlementTitle.find('h2').text
- if h2 == '搜索结果':
- return zgjsList
- weekdate = h2.strip().split('(')[1].split(')')[0]
- begindate = weekdate.split('-')[0].replace('.','-')
- enddate = weekdate.split('-')[1].replace('.','-')
- settlementList = soup.find(id='settlementList')
- # print(settlementList)
- if settlementList is None:
- return zgjsList
- if settlementList.find('table') is None:
- return zgjsList
- table_ = settlementList.find('table')
- tr_list = table_.find('table').find_all('tr')
- # 上级名称
- sjmc_1 = ''
- sjmc_2 = ''
- sjmc_3 = ''
- sjmc_4 = ''
- sjmc_5 = ''
- sjmc_6 = ''
- # 上上级名称
- ssjmc_1 = ''
- for n in range(1,len(tr_list)):
- td_list = tr_list[n].find_all('td')
- if tableName == 'Yztzzqktjb':
- if n == 1:
- sjmc_1 = td_list[0].get_text().replace('一、','').strip()
- if n == 4:
- sjmc_2 = td_list[0].get_text().replace('二、','').strip()
- ssjmc_1 = td_list[0].get_text().replace('二、','').strip()
- if n == 5:
- sjmc_3 = td_list[0].get_text().replace('1、','').strip()
- if n == 9:
- sjmc_4 = td_list[0].get_text().replace('2、','').strip()
- if n == 13:
- sjmc_5 = td_list[0].get_text().replace('三、','').strip()
- if n == 17:
- sjmc_6 = td_list[0].get_text().replace('四、','').strip()
- if tableName == 'Yztzzqktjb':
- if n in (6,10,14,18):
- continue
- zgjs = ZgjsEntry('','','','','','')
- zgjs.v2 = begindate
- zgjs.v3 = enddate
- if tableName == 'Yztzzqktjb':
- # 上级名称
- if n in (2,3):
- zgjs.v4 = sjmc_1
- if n in (5,9):
- zgjs.v4 = sjmc_2
- if n in (7,8):
- zgjs.v4 = sjmc_3
- zgjs.v5 = ssjmc_1
- if n in (11,12):
- zgjs.v4 = sjmc_4
- zgjs.v5 = ssjmc_1
- if n in (15,16):
- zgjs.v4 = sjmc_5
- if n in (19,20):
- zgjs.v4 = sjmc_6
- for i in range(0,len(td_list)):
- if i == 0:
- zgjs.v1 =td_list[i].get_text().replace('一、','').replace('二、','').replace('三、','').replace('四、','').replace('1、','').replace('2、','').strip()
- if i == 1:
- zgjs.v6 =td_list[i].get_text().strip().replace(',','')
- if zgjs is not None:
- zgjsList.append(zgjs)
- return zgjsList
- # 获取开始日期:
- def getBeginDate(bgdate,tableName):
- r_date = bgdate
- try:
- dbcfg = dbconfig()
- # 初始化数据库连接,
- engine = create_engine('sybase+pyodbc://'+dbcfg[1]+':'+dbcfg[2]+'@'+dbcfg[0])
- # 创建DBSession类型:
- DBSession = sessionmaker(bind=engine)
- session = DBSession()
- try:
- if tableName == 'Yztzzqktjb':
- results = session.query(func.max(Yztzzqktjb.enddate)).all()
- if len(results) != 0:
- r_date = results[0]
- else:
- pass
- except Exception as e:
- print('获取开始日期,查询异常;%s'%str(e))
- logger('获取开始日期,查询异常;%s'%str(e))
- session.rollback()
- finally:
- #关闭
- session.close()
- except Exception as e:
- print('获取开始日期,数据库连接失败;%s'%str(e))
- logger('获取开始日期,数据库连接失败;%s'%str(e))
- if r_date[0] is None:
- r_date = bgdate
- else:
- begin = time.strptime(r_date[0], "%Y-%m-%d")
- y,m,d = begin[0:3]
- r_date = datetime.date(y,m,d) + datetime.timedelta(days=7)
- r_date = r_date .strftime('%Y-%m-%d')
- return r_date
- def isCheckData(date_):
- r_code = 0
- try:
- dbcfg = dbconfig()
- # 初始化数据库连接,
- engine = create_engine('sybase+pyodbc://'+dbcfg[1]+':'+dbcfg[2]+'@'+dbcfg[0])
- # 创建DBSession类型:
- DBSession = sessionmaker(bind=engine)
- session = DBSession()
- try:
- if len(results) == 0:
- r_code = 1
- else:
- r_code = 0
- except Exception as e:
- r_code = 1
- print('判断是否有数据异常;%s'%str(e))
- logger('判断是否有数据异常;%s'%str(e))
- session.rollback()
- finally:
- #关闭
- session.close()
- except Exception as e:
- r_code = 1
- print('判断是否有数据,数据库连接异常;%s'%str(e))
- logger('判断是否有数据,数据库连接异常;%s'%str(e))
- #return r_code
- return 0
- # 执行入口
- def main(initdate_):
- req_list = [
- {'report':'6ac54ce22db4474abc234d6edbe53ae7','table':'Yztzzqktjb'}
- ]
- for req in req_list:
- #字符转日期
- begin = time.strptime(getBeginDate(initdate_,req['table']), "%Y-%m-%d")
- y,m,d = begin[0:3]
- #日期格式:2018-01-18
- begin = datetime.date(y,m,d)
- #获取当前日期
- end = datetime.date.today()
- if (end- begin).days < 0:
- pass
- else:
- for i in range(math.ceil((end - begin).days/7)+1):
- list_szzj = []
- # 日期转字符
- date_ = (begin+datetime.timedelta(days=i*7)).strftime('%Y-%m-%d')
- list_mzkb = getData(date_,req['report'],req['table'])
- if len(list_mzkb):
- savrData(req['table'],list_mzkb)
- else:
- pass
- time.sleep(0.5)
- if i % 350 == 0:
- time.sleep(15)
- if __name__ == '__main__':
- #外界参数vrg_date = sys.argv[1]
- vrg_date = ''
- dbcfg = dbconfig()
- vrg_endtime = dbcfg[3][0:2]+":"+dbcfg[3][2:4]+":"+dbcfg[3][4:6]
- var_initdate = dbcfg[4][0:4]+"-"+dbcfg[4][4:6]+"-"+dbcfg[4][6:8]
- var_interval = int(dbcfg[5])
- if len(vrg_date) ==8:
- vrg_date = str(vrg_date[0:4]) + "-" + str(vrg_date[4:6]) + "-" + str(vrg_date[6:8])
- end_time = time.strptime(vrg_endtime, "%H:%M:%S")
- y,m,d = end_time[3:6]
- end_time = datetime.time(y,m,d)
- logger.info("采集数据开始")
- print("采集数据开始")
- # 循环采集
- while True:
- now_time = time.strftime("%H%M%S")
- main(var_initdate)
- if isCheckData(vrg_date,) == 0:
- logger.info("采集数据结束")
- print("采集数据结束")
- break
- # 时间到停止采集
- if int(end_time.strftime('%H%M%S')) - int(now_time) <= 0:
- logger.info("采集数据结束")
- print("采集数据结束")
- break
- # 间隔执行时间
- logger.info("**********************(%s):没有采集到数据,任务继续执行**********************" %vrg_date)
- print("********************(%s):没有采集到数据,任务继续执行**********************" %vrg_date)
- time.sleep(var_interval)
- else:
- logger.info("日期参数格式不正确,请用格式:20180205")
- print("日期参数格式不正确,请用格式:20180205")
Python3:sqlalchemy对sybase数据库操作,非sql语句的更多相关文章
- django 快速数据库操作,不用SQL语句
配置models文件 # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import mod ...
- Delphi XE8中开发DataSnap程序常见问题和解决方法 (二)想对DBExpress的TSQLDataSet写对数据库操作的SQL语句出错了!
当我们搞定DataSnap后,我们进入客户端程序开发阶段了,我们建立了客户端模块后,打算按照刚才开发服务器的步骤开发客户端程序,随后加入了DBExpress的TSQLDataSet,设定数据库连接后, ...
- Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句 # python3 # author lizm # datetime 2018-02-01 10:00:00 # -*- co ...
- Python3.x:pyodbc连接Sybase数据库操作(Windows系统下DNS模式)
Python3.x:pyodbc连接Sybase数据库操作(Windows系统下DNS模式) 一.安装模块pyodbc pip install pyodbc 二.配置odbc数据源 (1).windo ...
- 通过MyEclipse工具直接操作数据库,执行sql语句,方便快捷
原文:通过MyEclipse工具直接操作数据库,执行sql语句,方便快捷 通过MyEclipse操作数据库,执行sql语句使我们不用切换多个工具,直接工作,方便快捷.效果如下: 步骤1:通过MyEcl ...
- 通过MyEclipse操作数据库,执行sql语句使我们不用切换多个工具,直接工作,方便快捷
通过MyEclipse操作数据库,执行sql语句使我们不用切换多个工具,直接工作,方便快捷.效果如下: 步骤1:通过MyEclipse中的window->show View->ot ...
- 【转载】 Sqlserver查看数据库死锁的SQL语句
在Sqlsever数据库中,有时候操作数据库过程中会进行锁表操作,在锁表操作的过程中,有时候会出现死锁的情况出现,这时候可以使用SQL语句来查询数据库死锁情况,主要通过系统数据库Master数据库来查 ...
- 在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计、SQL语句、java等层面的解决方案。
在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计.SQL语句.java等层面的解决方案. 解答: 1)数据库设计方面: a. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 whe ...
- Oracle数据库常用的Sql语句整理
Oracle数据库常用的Sql语句整理 查看当前用户的缺省表空间 : select username,default_tablespace from user_users; 2.查看用户下所有的表 : ...
随机推荐
- php学习七:时间和日期
在学习php中的时间和日期的时候,必须要了解什么是时间戳,那么什么是时间戳呢,请看一下的定义 时间戳:从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数 ...
- MQTT的学习研究(十)【转】mosquitto——一个开源的mqtt代理
MQTT(MQ Telemetry Transport),消息队列遥测传输协议,轻量级的发布/订阅协议,适用于一些条件比较苛刻的环境,进行低带宽.不可靠或间歇性的通信.值得一提的是mqtt提供三种不同 ...
- bigpipe&bigrender
bigpipe: 先输出页面的整体布局,在按块输出输出页面的每个部分.这样可以让服务器的运算.网络的传输和浏览器的渲染并行.适用于服务器运算较慢的时候. bigrender: 主要在浏览器端,先将字符 ...
- 如何判断SharedPreferences 记录存在
private EditText et; private String ettext; SharedPreferences settings; Editor editor; //设置 settings ...
- OC开发_Storyboard——绘制和视图
1.绘制 不要调用drawRect.调用setNeedsDisplay相当于告知系统视图需要重绘, 它会去调用drawRect,更新屏外缓冲器 2.UIBezierPath绘制图形, 设置图像op ...
- php程序中判断session过期
我们最常用的是在php程序中设置,如下例程序所示: if(!isset($_SESSION['abc']) || time()-$_SESSION['abc']>60){ $_SESSION[' ...
- Groovy中的面向对象
Groovy中的面向对象 前面说到groovy支持脚本和类,前面一节已将简单说了脚本和类之间的关系,这一节主要介绍一下groovy中类的相关知识,即面向对象相关知识. 1.类型 1.1 原始类型 gr ...
- poj1185 炮兵阵地【状压DP】
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 32802 Accepted: 12650 Descriptio ...
- 云备份厂商Rubrik再获2.61亿美元融资,估值高达33亿美元 转自中国存储网
数据管理初创公司Rubrik在Bain Capital Ventures领导的最新一轮融资中筹集了2.61亿美元,估值为33亿美元. 现有的利益相关者 - Lightspeed Venture Par ...
- django如何防止csrf(跨站请求伪造)
什么是CSRF 下面这张图片说明了CSRF的攻击原理: Django中如何防范CSRF Django使用专门的中间件(CsrfMiddleware)来进行CSRF防护.具体的原理如下: 1.它修改当前 ...