Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 5, 2012 15:33:15

chaotism
От:
Зарегистрирован: 2010-11-29
Сообщения: 76
Репутация: +  1  -
Профиль   Отправить e-mail  

python и mysql отлавливание ошибки

Достался от предшественника скрипт для удаления лишних записей в базе.
Решил его усовершенствовать, чтобы не выполнять его каждый раз сделать цикл, да дописать 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()



Офлайн

#2 Апрель 6, 2012 10:22:39

chaotism
От:
Зарегистрирован: 2010-11-29
Сообщения: 76
Репутация: +  1  -
Профиль   Отправить e-mail  

python и mysql отлавливание ошибки

мысль после обработки запроса по изменению базы сразу fetchall делать с принтом, чтобы посмотреть как идет обращение к базе



Офлайн

#3 Апрель 24, 2012 09:49:41

chaotism
От:
Зарегистрирован: 2010-11-29
Сообщения: 76
Репутация: +  1  -
Профиль   Отправить e-mail  

python и mysql отлавливание ошибки

в итоге сделал stdout в файл, посмотрел поправил все нормально отработалось



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version