Pythonic способ интеллектуальной загрузки данных с помощью таблицы отображения поля? - PullRequest
2 голосов
/ 01 апреля 2011

У меня сложная таблица (несколько сотен столбцов), и я время от времени получаю данные в CSV-файлах. Все, что мне нужно сделать, это обновить таблицу с данными из файла CSV.

Это то, чем я сейчас пользуюсь: ничего особенного (не думаю, что я использую мощность Python?). Если кто-то сможет перевести это на что-нибудь Pythonic, это будет здорово!

Идея состоит в том, чтобы сопоставить имена столбцов из MyTable и Field_Mapping и сделать соответствующие обновления. Если столбец имеет значение умножения, он будет умножаться на это значение при вставке / обновлении.

Извините за грязный код Python, изо всех сил стараюсь сделать его читабельным.

MyDB.MyTable
------------

PK DateAdded  Firm Addr1     Website
------------------------------------
1  2011-01-01 ABC  1 Main St abc.com

MyDB.Field_Mapping
------------------

SourceColumns TargetTableColumns Multiply
-----------------------------------------
PK          PK           
webaddr       Website
address       Addr1
assets        value              x1000

Код Python:

import string, os, sys

# DB Conn String here

cursor = db.cursor()
cursor2 = db.cursor()
cursor3 = db.cursor()

TableName = sys.argv[1]

cursor.execute("select * from `" + TableName + "` limit 1")

for cursorFieldname in cursor.description:
    cursor2.execute("select TargetTableColumns from MyDB.Field_Mapping where FDIC = \"" + cursorFieldname[0] + "\"")
    row = cursor2.fetchone()

    if row > -1:
       cursor2.execute("alter table `" + TableName + "` change `" + cursorFieldname[0] + "` `" + str(row[0]) + "` varchar(255)")

cursor3.execute("create index PKIndx on `" + filename + "`(PK);")
cursor3.execute("insert ignore into MyDB.MyTable (PK, dateadded) select PK, now() from `" + TableName + "`;")
cursor3.execute("select count(*) from `" + filename + ";")
row2 = cursor3.fetchone()

if str(row2[0]) > "1000": #Deleting PKs > 1000
    cursor3.execute("delete from MyDB.MyTable where PK < \"a\" and PK not in (select PK from `" + filename + "`);")

cursor.execute("select * from `" + filename + "` limit 1")

for cursorFieldname in cursor.description:
    cursor2.execute("select * from MyDB.MyTable limit 1")
    for cursorFieldname2 in cursor2.description:
        if cursorFieldname[0].lower() == cursorFieldname2[0].lower():
         cursor3.execute("select multiply from MyDB.Field_Mapping where TargetTableColumns = \"" + cursorFieldname[0] + "\"")
         row2 = cursor3.fetchone()

         if str(row2[0]) == "x1000":
            cursor3.execute("update MyDB.MyTable as a, `" + filename + "` as b set a.`" + cursorFieldname[0] + "` = b.`" + cursorFieldname[0] + "`*1000 where a.PK = b.PK;")

         elif str(row2[0]) == "%":
            cursor3.execute("update MyDB.MyTable as a, `" + filename + "` as b set a.`" + cursorFieldname[0] + "` = round(b.`" + cursorFieldname[0] + "`, 2) where a.PK = b.PK;")

         else:
            if cursorFieldname[0] == "addr1":
            cursor3.execute("update MyDB.MyTable as a, `" + filename + "` as b set a.`" + cursorFieldname[0] + "` = b.`" + cursorFieldname[0] + "` where a.PK = b.PK and b.`" + cursorFieldname[0] + "` != \"Main Street\";")

        elif cursorFieldname[0] != "PK":
            if cursorFieldname[0].lower() == "website":
                cursor3.execute("update `" + filename + "` set website = lcase(website)")
            cursor3.execute("update MyDB.MyTable as a, `" + filename + "` as b set a.`" + cursorFieldname[0] + "` = b.`" + cursorFieldname[0] + "` where a.PK = b.PK;")

cursor.close()
cursor2.close()
cursor3.close()
db.close()

1 Ответ

1 голос
/ 01 апреля 2011

Я бы начал с выражения приведенного выше кода в виде простого английского алгоритма.Разбиение проблемы на основную часть того, что вы хотите сделать, а не на то, как вы хотите это делать, часто значительно упрощает вещи.

Посмотрите на уровни абстракции базы данных , если хотитеупростить доступ. SQLAlchemy довольно хорошо из того, что я слышал.

Лично, если тот код, который у вас есть, работает (это не совсем много кода), зачем его менять?: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...