Ералаш

Материал из Tech_support
Перейти к: навигация, поиск
Знай наших!

Примеры хорошего дизайна:

7Z

7z -t7z -mx=9 -r -ssc a /home/bases/bases-arh/day-on/base_`date +%d_%m_%y`.7z /home/bases/bases-arh/temp;

кстати в этой команде русский поддерживается.. но в скрипте надо локаль цеплять обязательно.. если работаешь через крон вот так: export LANG=ru_RU.UTF-8;

Обработка строк, полученных из БД PostgreSQL

Задача: В таблице mytable есть 3 поля,первое поле - униальный ключ, во втором поле содержатся данные в виде: "Вася;петя;оля;...;толя" Необходимо разделить все имена по отдельности, сделать заглавной первую букву и занести их в таблицу mytable2, где первое поле - уникальный ключ

Решение:

import psycopg2
import sys
import string 
def main():
  
    conn_string = "host='localhost' dbname='db' user='pguser' password='pwd'"
    print "Connecting to database\n    ->%s" % (conn_string)
    try:
        conn = psycopg2.connect(conn_string)
        cursor = conn.cursor()
    except:
        exceptionType, exceptionValue, exceptionTraceback = sys.exc_info()
        sys.exit("Database connection failed!\n ->%s" % (exceptionValue))
   
    cursor.execute("SELECT * FROM mytable") # в таблице 3 поля
    temp_prof=list(cursor.fetchall())   # превращаем объект QuerySet в простой список
    conn.commit()                    # завершение транзакий
    for row in temp_prof:         # перебираем все записи в списке, можно выбирать только второе поле, память сэкономим
        for val in row[1].split(';'):       # втором элементе каждой строки содержатся фразы, разделенные символом ";"
                                            # их количество разное, поэтому циклом
            val1=val.decode('utf-8').strip().capitalize()   # необходимо для правильного разбора фразы, её длины(не удвоенной) 
                                                            # и вообще символов.
                                                            # декодировал в ютф8 - обрезал пробелы - первый символ сделал заглавным
            cursor.execute("SELECT COUNT(*) FROM mytable2") #сколько записей в mytable2 на момент запроса
            ttemp=list(cursor.fetchall())   # превращаем объект QuerySet в простой список
            conn.commit()
            print ttemp[0][0]  # ttemp возвращает [(0L,)] - словарь или список, то что после функции list() получилось
                               # ttemp[0] возвращает (0L,) - кортеж (в конце запятая)
                               # ttemp[0][0] возвращает 0 - число, то что надо(COUNT(*) в моём случае равно 0(в самом начале)).
            new_index_tabl_info = ttemp[0][0]+1 # присваиваем индекс в mytable2 (следующий)
            cursor.execute("SELECT * FROM spravochnik_siz_professia_info WHERE professia= '%s'" % val1) # есть ли фраза в таблице
            temp=list(cursor.fetchall()) # превращаем в список для удобства
            conn.commit()
            if not temp: # если список пуст, т.е. нет фразы в таблице
               data = {'id':str(new_index_tabl_info), 'prof':val1} # формируем словарь значений ключ:значение
                                                                   # ВАЖНО! Ключ должен совпадать с именем поля в таблице
               cursor.execute("""INSERT INTO mytable2 VALUES (%(id)s, %(prof)s);""", data) # заносим данные в mytable2 
               conn.commit()
              
    cursor.close()   # очищаем память - закрываем курсор
    conn.close()     # очищаем память - закрываем соединение
    sys.exit()       # game over
if __name__ == "__main__":
    sys.exit(main())