2011-04-01 2 views
2

나는 복잡한 테이블 (몇 백 열)을 가지고 있으며, 나는 때때로 CSV 파일에 데이터를 얻는다. 내가해야 할 일은 csv 파일의 데이터로 테이블을 업데이트하는 것뿐입니다.필드 매핑 테이블을 사용하여 지능적으로 데이터를로드하는 Pythonic 방식?

이것은 내가 지금 사용하고있는 것입니다 : 아무것도 멋지지 않습니다. (아마도 파이썬 파워를 사용하지 않습니까?). 누군가 이것을 이것을 Pythonic으로 번역 할 수 있다면 그것은 굉장 할 것입니다!

아이디어는 MyTable과 Field_Mapping의 열 이름을 일치시키고 그에 따라 업데이트하는 것입니다. 열에 곱하기 값이 있으면 삽입/업데이트 중 해당 값이 곱 해집니다.

지저분한 파이썬 코드에 대해 유감스럽게 생각합니다.

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 

파이썬 코드 : 나는 일반 영어 알고리즘으로 위의 코드를 표현함으로써 시작할 것

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

. 문제를 당신이하고 싶은 것의 근본적인 물음에 얽매이지 않고, 어떻게하면 좋을지를 종종 간단하게합니다.

액세스를 간소화하려면 database abstraction layers을 살펴보십시오. SQLAlchemy은 내가들은 것을 꽤 잘 보여줍니다.

개인적으로, 거기에있는 코드가 작동한다면 (정확히 많은 코드가 아닙니다) 왜 변경합니까? :-)

+0

소리가 좋은 계획입니다! 필자는 당면한 문제를 충분히 간단하게 생각했습니다. 열 이름을 일치시키고 데이터를 업데이트하십시오. 소요 시간과 효율성으로 인해 다시 작성해야하는 이유가 있습니다. 나는 그것을하는 pythonic 방법이 크게 코드를 최소화하고 효율성을 증가시킬 것이라고 생각했습니다! SQLAlchemy에 대한 좋은 소식을 들었습니다. 고맙습니다! – ThinkCode

관련 문제