是否缓存的决定完全取决于您。过时的数据会成为问题吗?
我能想到的最简单的缓存方案是使用 Python 的pickle 模块如下所示:
import MySQLdb
import csv
import pprint
import time
MAX_CACHE_AGE = 60*20 # 20 Minutes
CACHE_FILENAME = 'results.cache'
with open(CACHE_FILENAME, 'r') as cache:
cached = pickle.load(cache)
if(time.time() > cached['timestamp'] + MAX_CACHE_AGE):
# Cache too old, run query
db = MySQLdb.connect(host="localhost", # The Host
user="username", # username
passwd="password", # password
db="dbname") # name of the data base
cursor = db.cursor()
cursor.execute("SELECT name, id, city, storeid FROM Products;")
StudentsData = cursor.fetchall()
# Update cache file
data = {'results': StudentsData, 'timestamp':time.time()}
with open(CACHE_FILENAME, 'w') as cache:
pickle.dump(data, cache)
else:
# Cached data is fresh enough, use that
StudentsData = cached['results']
pprint.pprint(StudentsData)
您需要results.cache
手动初始化文件一次。
编辑
该with
语法是上下文管理器,在 Python 2.5 中引入。
with open(CACHE_FILENAME, 'r') as cache:
cached = pickle.load(cache)
可以改写为
cached = open(CACHE_FILENAME, 'r')
cached = pickle.load(cache)
cached.close()
编辑2
经过长时间的聊天讨论,以下工作:
import MySQLdb
import csv
import pprint
import time
import pickle
MAX_CACHE_AGE = 60*20 # 20 Minutes
CACHE_FILENAME = 'results.cache'
regen = False
try:
with open(CACHE_FILENAME, 'r') as cache:
cached = pickle.load(cache)
if(time.time() > cached['timestamp'] + MAX_CACHE_AGE):
print("Cache too old: regenerating cache")
regen = True
else:
print("Cached data is fresh enough: loading results from cache")
except IOError:
print("Error opening %s: regenerating cache" % CACHE_FILENAME)
regen = True
if(regen):
# Cache too old, run query
db = MySQLdb.connect(host="localhost", # The Host
user="username", # username
passwd="password", # password
db="dbname") # name of the data base
cursor = db.cursor()
cursor.execute("SELECT name, id, city, storeid FROM Products;")
StudentsData = cursor.fetchall()
cursor.close()
# Update cache file
data = {'results': StudentsData, 'timestamp':time.time()}
with open(CACHE_FILENAME, 'w') as cache:
pickle.dump(data, cache)
else:
# Cached data is fresh enough, use that
StudentsData = cached['results']
print StudentsData