python手机代码查询命令_在Python中通过os.system在命令行上执行MySQL查询

该博客介绍了一段Python代码,用于从命令行接收数据库凭据和日期范围,然后通过子进程调用MySQL执行SQL查询。代码使用optparse处理参数,按日期生成统计报告并保存到指定目录。文章特别适合Python初学者,讨论了如何简化代码和提高可读性。
摘要由CSDN通过智能技术生成

下面的代码可能会帮你解决问题。它不是特别令人兴奋,而且故意简单。这不是很多程序员解决这个问题的方式,但是如果没有更多的信息,它似乎可以满足您的需求。

我还假设您是python新手;如果我错了,可以忽略这篇文章。允许在命令行上传递数据库凭据、输出目录和日期(开始和结束)。

使用子进程代替os.system。Subprocess提供了从python调用外部可执行文件的首选机制。这段代码使用其中最简单的一个:call(),因为它类似于os.system()

使用optparse处理命令行参数。虽然代码肯定会更长、更详细,但将来对arg处理进行添加和修改会更容易。它也很清楚发生了什么(而且代码的读取频率总是远远高于它的写入频率)。

命令行设置只在脚本在__main__块中执行时运行。由于脚本的“逻辑”在main()方法中,您还可以导入它并从另一个源提供options对象(和arg list)。

如果不需要将每个日期输出到单独的文件中,则可以让数据库引擎计算SUM()并按日期对它们进行分组。您可以在一个db调用中得到所有的和,这样会更快,并且可以生成更简单的代码。#!/usr/bin/python

# -*- coding: utf-8 -*-

import datetime

import os

import subprocess

from optparse import OptionParser

SQL = """SELECT d.Date, SUM(d.CostUsd) FROM Stats d WHERE d.Date = '%s' GROUP BY d.Date"""

def get_stats(options, dateobj):

"""Return statistics for the date of `dateobj`"""

_datestr = dateobj.strftime('%Y-%m-%d')

sql = SQL % _datestr

filepath = os.path.join(options.outdir, 'DateLoop-%s.txt' % _datestr)

return subprocess.call('mysql -h %s -u %s -p -sN -e "%s" db > %s' % (options.dbhost, options.dbuser, sql, filepath), shell=True)

def main(options, args):

""""""

_date = options.startdate

while _date <= options.enddate:

rs = get_stats(options, _date)

_date += datetime.timedelta(days=1)

if __name__ == '__main__':

parser = OptionParser(version="%prog 1.0")

parser.add_option('-s', '--startdate', type='string', dest='startdate',

help='the start date (format: yyyymmdd)')

parser.add_option('-e', '--enddate', type='string', dest='enddate',

help='the end date (format: yyyymmdd)')

parser.add_option('--output', type='string', dest='outdir', default='/home/output/',

help='target directory for output files')

parser.add_option('--dbhost', type='string', dest='dbhost', default='myhost',

help='SQL server address')

parser.add_option('--dbuser', type='string', dest='dbuser', default='dbuser',

help='SQL server user')

options, args = parser.parse_args()

## Process the date args

if not options.startdate:

options.startdate = datetime.datetime.today()

else:

try:

options.startdate = datetime.datetime.strptime('%Y%m%d', options.startdate)

except ValueError:

parser.error("Invalid value for startdate (%s)" % options.startdate)

if not options.enddate:

options.enddate = options.startdate + datetime.timedelta(days=7)

else:

try:

options.enddate = datetime.datetime.strptime('%Y%m%d', options.enddate)

except ValueError:

parser.error("Invalid value for enddate (%s)" % options.enddate)

main(options, args)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值