python--Python脚本执行SQL

说明:在Linux写python脚本执行SQL,废话不多说,直接贴代码解释。

#!/usr/bin/env python

##python脚本格式,这里有一点要说明的是:#!/usr/bin/env python与#!/usr/bin/python的区别?
##如下:#!/usr/bin/python 的意思是说去/usr/bin/目录下找python去执行#!/usr/bin/env python 的意思是在#!/usr/bin/env中找到python的安装路径,然后去执行它,这个可执行的python路径不管是不是在/usr/bin下,用法比较灵活,而#!/usr/bin/python 就写成了绝对路径,只能去/usr/bin下找。

import pyhs2        ##导入相关的模块,要操作MySQL这个import pymysql是必须的
import sys
import datetime
import pymysql

default_encoding = 'utf-8'    ##设置默认的编码格式为'utf-8'

##执行SQL
def exec_sql(sql):
    cursor = db.cursor() ##利用db方法创建游标对象
    try:
        cursor.execute(sql)
        return db.commit() ##链接不会默认提交需要您手动提交
    except Exception as e:
        print "Error: unable to fecth data", e
        return db.rollback() ##若错误则回滚
##链接数据库
db = pymysql.connect('host', '用户名', '密码', '数据库', port=端口)

conn = pyhs2.connect(host='',
                                  port=,
                                  authMechanism='',
                                  user='',
                                  password='',
                                  database='',)
##定义时间参数
now = datetime.datetime.now()
yday = (now + datetime.timedelta(days=-1)).strftime('%Y%m%d')
##下面写SQL语句
sql = '''
SELECT route,
         launchscene,
         count(1),
         count(DISTINCT uid),
         (sum(CASE
                  WHEN hcnt>0 THEN 0
                  ELSE 1
              END) / count(1)) AS jjlost,
         avg(duration) AS duration
  FROM
    (SELECT UID,
            route,
            pid,
            launchscene,
            sum(hcnt) AS hcnt,
            sum(cnt) AS cnt,
            (max(cts)-min(cts))/1000 AS duration
     FROM
       (SELECT t2.uid,
               t2.route,
               t2.launchscene,
               t2.cts,
               CASE
                   WHEN action IN ('onLoad',
                                   'onHide',
                                   'onShow',
                                   'onUnload',
                                   'login',
                                   'onLaunch',
                                   'onReady') THEN 0
                   ELSE 1
               END AS cnt,
               CASE
                   WHEN praction='onHide' THEN 1
                   ELSE 0
               END AS hcnt,
               sum(CASE
                       WHEN route <> prroute
                            OR praction='onHide'
                            OR praction='onUnload' THEN 1
                       ELSE 0
                   END) over (partition BY UID ROWS BETWEEN unbounded preceding AND CURRENT ROW) AS pid
        FROM
          (SELECT UID,
                  route,
                  launchscene,
                  action,
                  lag(action, 1) over(partition BY UID
                                      ORDER BY cts) AS praction,
                  lag(route, 1) over(partition BY UID
                                     ORDER BY cts) AS prroute,
                  cts
           FROM crs_events
           WHERE ds='20190429'
             AND UID IS NOT NULL
             AND route != '') t2) t3
     GROUP BY UID,
              route,
              pid,
              launchscene) t4 WHERE duration>0.1
GROUP BY route,
         launchscene
'''
##插入数据到指定MySQL的表中
cur = conn.cursor()
cur.execute(sql)
for i in cur.fetch():
    sql = "insert into crs_page_scene_stat values('%s', '%s', %d, %d, %d, %f, %f) on duplicate key update pv=%d, uv=%d, jumpr=%f, duration=%f;" % (yday, i[0], i[1], i[2], i[3], i[4], i[5], i[2], i[3], i[4], i[5])
    print exec_sql(sql)

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值