Форум сайта python.su
Достался от предшественника скрипт для удаления лишних записей в базе.
Решил его усовершенствовать, чтобы не выполнять его каждый раз сделать цикл, да дописать Optimize в конеце. Но что то не так идет, могу точно опеределить по флагам архивации почему то они не ставяться, старый скрипт запускаю работает
добавил только цикл while и в конце пара запросов.
Заодно подскажите, как сделать чтобы на экран консоли выдавалась вся информация о происходящем в том числе успешность выполняния команд Mysql, пробовал stdout но не получилось
from MySQLdb import connect, cursors # Соединяемся с базой данных conn = connect(host='localhost', db='inetstat', user='script_user', passwd='Vfyecrhbgn') cursor = conn.cursor() # Определяем, нужно ли архивирование, и какой месяц архивировать. В архив уходят данные старше полугода cursor.execute('SELECT month, year FROM totals WHERE archived=0 ORDER BY year*100+month') i = cursor.rowcount while True: cursor.execute('SELECT month, year FROM totals WHERE archived=0 ORDER BY year*100+month') if i > 7: print "first block" print "i =" + str(i) res = cursor.fetchone() i-= 1 M = res[0] Y = res[1] date1 = '%s-%s-1' % (Y, M) print "rowcount"+str(cursor.rowcount) print "["+date1+"]" res = cursor.fetchone() i-= 1 date2 = '%s-%s-1' % (res[1], res[0]) print "rowcount"+str(cursor.rowcount) print "["+date2+"]" # Выбираем все данные за этот месяц и вычисляем итоговые суммы # Одновременно получаем список идентификаторов сайтов, на которые пользователи ходили за этот месяц print "second block" SiteIds = [] UserPairs = {} SQL = """ SELECT truser, trunit, trsite, trout, trin FROM traffic WHERE trdate>=%s AND trDate<%s """ cursor.execute(SQL, (date1, date2)) while (1): res = cursor.fetchone() if res: pair = (res[0], res[1]) traf = UserPairs.get(pair, [0, 0]) traf[0] = traf[0] + res[3] traf[1] = traf[1] + res[4] UserPairs[pair] = traf if res[2] not in SiteIds: SiteIds.append(res[2]) else: break # Удаляем всю информацию за этот месяц print "three block" cursor.execute('DELETE FROM traffic WHERE trdate>=%s AND trDate<%s', (date1, date2)) # Заносим в таблицу суммарные данные. # Теперь для каждой пары (пользователь, подразделение) в таблице будет только одна строка # Она будет за первое число этого месяца, идентификатор сайта и порт = 0 SQL = 'INSERT INTO traffic VALUES (%s, %s, %s, 0, 0, %s, %s)' for k,v in UserPairs.items(): cursor.execute(SQL, (date1, k[0], k[1], v[0], v[1])) # Перебираем список сайтов, определяем, какие из них больше не в базе данных print "four block" cursor.execute('SELECT distinct(trsite) FROM traffic') ActiveSites = cursor.fetchall() Domains = [] for s in SiteIds: if s not in ActiveSites: cursor.execute('SELECT domain FROM sites WHERE siteid=%s', s) if s not in Domains: Domains.append(s) cursor.execute('DELETE FROM sites WHERE siteid=%s', s) # Перебираем список доменов и удаляем мертвые print "five block" cursor.execute('SELECT distinct(domain) FROM sites') ActiveDomains = cursor.fetchall() for s in Domains: if s not in ActiveDomains: cursor.execute('DELETE FROM domains WHERE domid=%s', s) # Отмечаем данный месяц как заархивированный cursor.execute('UPDATE totals SET archived=1 WHERE month=%s AND year=%s' % (M, Y)) else: break #Что с последний блоком что без последнего, все равно архивация залипает cursor.execute("SHOW TABLES"); t = [] while True: row = cursor.fetchone() if str(row) != "None": table = row[0] #q = "LOCK TABLES " + row[0] +" " + "WRITE;" #print q #cursor.execute(q); t += [row[0]] else: break for k in t: O = "OPTIMIZE TABLE " + k + ";" print O cursor.execute(O) pri = "База данных оптимизированна" print pri.decode('utf8').encode('cp866', "replace") # Закрываем соединение с базой данных cursor.close() conn.commit() conn.close()
Офлайн
мысль после обработки запроса по изменению базы сразу fetchall делать с принтом, чтобы посмотреть как идет обращение к базе
Офлайн
в итоге сделал stdout в файл, посмотрел поправил все нормально отработалось
Офлайн