代碼可能會幫助你。它並不特別令人興奮,故意簡單。這不是很多程序員解決這個問題的方式,但是沒有更多的信息,它似乎滿足了你的要求。
我也假設你是python的新手;如果我錯了,請隨時忽略此帖。
- 允許在命令行上傳遞數據庫憑證,輸出目錄和日期(開始和結束)。
- 使用子進程來代替os.system。子進程提供了從python調用外部可執行文件的首選機制。此代碼使用其中最簡單的代碼; call(),因爲它與os.system()相似
- 使用optparse來處理命令行參數。雖然代碼當然更長且更冗長,但您將來可以更容易地對arg處理進行添加和修改。它也很清楚發生了什麼(代碼總是被讀取得比寫入的要多得多)。
- 命令行設置僅在執行腳本時運行,因爲它位於
__main__
塊內。由於腳本的「邏輯」在main()方法中,因此您也可以將其導入並從另一個源提供選項對象(和arg列表)。
如果您不需要在單獨的文件中輸出每個日期,可以讓數據庫引擎計算SUM()並按日期對它們進行分組。你會得到一個數據庫調用的所有款項,這將更快,可以產生更簡單的代碼。
#!/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)
使用MySQLdb模塊有什麼問題? – alberge 2009-08-03 18:29:01