Архив метки: python

Python и Mysql — получение последнего вставленного ID

Ну проще всего показать на примере:

def InsertUserToForpost(connf,login,passw):
    putlog("*добавляем учетку в Форпост "+str(login));    
    sql="insert into User (ID,IsActive,CanChangeOwnInfo,CreationDate,Login,Password,TypeId) values (null,1,1,now(),%s,MD5(%s),2);";
    cursor = connf.cursor(dictionary=True,buffered=True)
    cursor.execute(sql,[login,passw]);
    connf.commit()
    #получаем ID
    lid=conf.insert_id()
    sql="insert into AccountUser (ID,UserID,AccountID,IsReadOnly) VALUES (null,%s,1,1);";
    cursor = connf.cursor(dictionary=True,buffered=True)
    cursor.execute(sql,[lid]);

Python нормализация даты полученной из MySQL

Формат даты MySQL и Python несколько отличаются, поэтому не получится результат запроса — дату, использовать сразу. Нужно предварительно её отформатировать при помощи функции strptime(дата, формат). Вот пример кода:

        sql="select count(*) as cnt,(now()-interval %s day) as ddy  from payments where mod_person=%s and year(pay_date)=year(now()-interval %s day) and month(pay_date)=month(now()-interval %s day) and day(pay_date)=day(now()-interval %s day)";
        cursor2=connb.cursor(dictionary=True,buffered=True)
	cursor2.execute(sql,[days,person_id,days,days,days]);
	myrow3 = cursor2.fetchone()	
	while myrow3 is not None:    
	    cnt=myrow3["cnt"];   
            ddy=myrow3["ddy"];   	    
	    ddt=datetime.datetime.strptime(str(ddy),"%Y-%m-%d %H:%M:%S")
	    wd=datetime.datetime.weekday(ddt);    
	    if wd==0:dn="Понедельник";
	    if wd==1:dn="Вторник";
	    if wd==2:dn="Среда";
	    if wd==3:dn="Четверг";
	    if wd==4:dn="Пятница";
	    if wd==5:dn="Суббота";
	    if wd==6:dn="Воскресенье";
	    #Если платежей нет в выходные, тогда АХТУНГ!!
            if ((cnt==0) and (wd!=5) and (wd!=6)):
               func.putlog (str(email.encode('utf-8'))+" Внимание! В биллинге нет платежей за "+str(ddy)+" ("+str(wd)+") от "+str(name.encode('utf-8'))+"!!")
	       func.AddMailQwery(noc,'цувцу@цувцув.ru',email,"Внимание! В биллинге нет платежей за "+str(ddy)+" ("+str(wd)+") от "+str(name.encode('utf-8'))+"!!","Внимание! В биллинге нет платежей за "+str(ddy)+" ("+str(wd)+") от "+str(name.encode('utf-8'))+"!!");
                   #SendMailAttachment($email,$cfg->smtpusername,"Внимание! В биллинге нет платежей за $ddy ($dn) от $name!!!","Внимание! В биллинге нет платежей за $ddy ($dn) от $name!!!");                                                             
	    myrow3 = cursor2.fetchone()

python, получение статуса портов на всём устройстве

Задача: необходимо получить статусы портов одним массивом, одной командой.

Решение: используем bulkCmd:

def GetArrayPortStatus(ip,comm,oid):
     rez=None	    
     for errorIndication, errorStatus, \
	errorIndex, varBinds in bulkCmd(
	    SnmpEngine(),
	    CommunityData(comm),
	    UdpTransportTarget((ip, 161)),
	    ContextData(),
	    0, 50,  # GETBULK specific: request up to 50 OIDs in a single response
	    ObjectType(ObjectIdentity('1.3.6.1.2.1.2.2.1.8')),
	    lookupMib=False, lexicographicMode=False):

	if errorIndication:
	    print(errorIndication)
	    break
	elif errorStatus:
	    print('%s at %s' % (errorStatus.prettyPrint(),
				errorIndex and varBinds[int(errorIndex)-1][0] or '?'))
	    break
	else:
	    for varBind in varBinds:
		print(' = '.join([x.prettyPrint() for x in varBind])) 	    
     return rez

Работа с именованными массивами на Python

Задача: получить список портов и их состояний из БД в именованый массив.

Обьявление массива:

res[]

Добавление в массив:

res.append({name:{‘port_id’:port_id,’name’:name,’status’:status}});

Другие функции работы с массивом:

array.typecode — TypeCode символ, использованный при создании массива.

array.itemsize — размер в байтах одного элемента в массиве.

array.append(х) — добавление элемента в конец массива.

array.buffer_info() — кортеж (ячейка памяти, длина). Полезно для низкоуровневых операций.

array.byteswap() — изменить порядок следования байтов в каждом элементе массива. Полезно при чтении данных из файла, написанного на машине с другим порядком байтов.

array.count(х) — возвращает количество вхождений х в массив.

array.extend(iter) — добавление элементов из объекта в массив.

array.frombytes(b) — делает массив array из массива байт. Количество байт должно быть кратно размеру одного элемента в массиве.

array.fromfile(F, N) — читает N элементов из файла и добавляет их в конец массива. Файл должен быть открыт на бинарное чтение. Если доступно меньше N элементов, генерируется исключение EOFError , но элементы, которые были доступны, добавляются в массив.

array.fromlist(список) — добавление элементов из списка.

array.index(х) — номер первого вхождения x в массив.

array.insert(n, х) — включить новый пункт со значением х в массиве перед номером n. Отрицательные значения рассматриваются относительно конца массива.

array.pop(i) — удаляет i-ый элемент из массива и возвращает его. По умолчанию удаляется последний элемент.

array.remove(х) — удалить первое вхождение х из массива.

array.reverse() — обратный порядок элементов в массиве.

array.tobytes() — преобразование к байтам.

array.tofile(f) — запись массива в открытый файл.

array.tolist() — преобразование массива в список.

Пример:

def GetPortList(conn,device_id):           
    sql="select ports.name,device_status.device_id,device_status.port_id,device_status.param_value from device_status inner join ports on ports.port_id=device_status.port_id where device_status.device_id=%s and device_status.port_id>0";
    cursor = conn.cursor(dictionary=True,buffered=True)
    cursor.execute(sql,[device_id]);
    row = cursor.fetchone()
    res=[]
    while row is not None:        
	name=row["name"];
	port_id=row['port_id'];
	status=row['param_value'];
	res.append({name:{'port_id':port_id,'name':name,'status':status}});
	row = cursor.fetchone()
    cursor=None
    return res

port_list=GetPortList(connb,row["device_id"]);
pprint.pprint(port_list)

Получится чудный вывод на экран чтото типа:

[{1: {'name': 1, 'port_id': 319, 'status': u'2'}},
 {2: {'name': 2, 'port_id': 320, 'status': u'2'}},
 {3: {'name': 3, 'port_id': 321, 'status': u'2'}},
 {4: {'name': 4, 'port_id': 322, 'status': u'2'}},
 {5: {'name': 5, 'port_id': 323, 'status': u'2'}},
 {6: {'name': 6, 'port_id': 324, 'status': u'2'}},
 {7: {'name': 7, 'port_id': 325, 'status': u'2'}},
 {8: {'name': 8, 'port_id': 326, 'status': u'2'}},
 {9: {'name': 9, 'port_id': 327, 'status': u'1'}},
 {10: {'name': 10, 'port_id': 328, 'status': u'2'}},
 {11: {'name': 11, 'port_id': 329, 'status': u'1'}},
 {12: {'name': 12, 'port_id': 330, 'status': u'1'}},
 {13: {'name': 13, 'port_id': 331, 'status': u'2'}},
 {14: {'name': 14, 'port_id': 332, 'status': u'2'}},
 {15: {'name': 15, 'port_id': 333, 'status': u'2'}},
 {16: {'name': 16, 'port_id': 334, 'status': u'1'}},
 {17: {'name': 17, 'port_id': 335, 'status': u'2'}},
 {18: {'name': 18, 'port_id': 336, 'status': u'2'}},
 {19: {'name': 19, 'port_id': 337, 'status': u'2'}},
 {20: {'name': 20, 'port_id': 338, 'status': u'2'}},
 {21: {'name': 21, 'port_id': 339, 'status': u'2'}},
 {22: {'name': 22, 'port_id': 340, 'status': u'2'}},
 {23: {'name': 23, 'port_id': 341, 'status': u'2'}},
 {24: {'name': 24, 'port_id': 342, 'status': u'1'}},
 {25: {'name': 25, 'port_id': 343, 'status': u'2'}},
 {26: {'name': 26, 'port_id': 344, 'status': u'2'}},
 {27: {'name': 27, 'port_id': 345, 'status': u'2'}},
 {28: {'name': 28, 'port_id': 346, 'status': u'1'}}]

RuntimeError: autoconf error

Ошибка возникла при попытке установить модуль pysnmp  во FreeBSD:

pip install pysnmp

Решение:

— ставим gcc, убеждаемся что /tmp смонтирован с флагом exec. Помогло. Теперь другая ошибка:

src/_fastmath.c:36:11: fatal error: ‘gmp.h’ file not found

Решение: копируем gmp.h из /usr/include/ в /usr/local/include/