Mysql 使用字段映射表智能加载数据的Python方式?
我有一个复杂的表格,有几百列,我时不时地从csv文件中获取数据。我所要做的就是用csv文件中的数据更新表 这就是我现在所使用的:我想,没有什么比不使用Python强大的功能更有趣的了?。如果有人能把这句话翻译成Pythonic,那就太棒了 其思想是匹配MyTable和Field_映射中的列名,并相应地进行更新。如果列有一个乘法值,则在插入/更新时它将乘以该值 抱歉,Python代码太乱了,我尽了最大努力让它可读Mysql 使用字段映射表智能加载数据的Python方式?,mysql,data-structures,python,Mysql,Data Structures,Python,我有一个复杂的表格,有几百列,我时不时地从csv文件中获取数据。我所要做的就是用csv文件中的数据更新表 这就是我现在所使用的:我想,没有什么比不使用Python强大的功能更有趣的了?。如果有人能把这句话翻译成Pythonic,那就太棒了 其思想是匹配MyTable和Field_映射中的列名,并相应地进行更新。如果列有一个乘法值,则在插入/更新时它将乘以该值 抱歉,Python代码太乱了,我尽了最大努力让它可读 MyDB.MyTable ------------ PK DateAdded F
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()
我首先将上面的代码表示为一个简单的英语算法。把一个问题分解成你想做的事情的基本部分,而不是你想怎么做,通常会大大简化事情 如果要简化访问,请查看。据我所知,这很好
就我个人而言,如果你那里的代码有效,那么它不是很多代码,为什么要更改它呢- 听起来像个计划!我认为眼前的问题很简单——匹配列名并更新数据。时间和效率是我想重写它的原因。我认为一些pythonic的方法可以极大地减少代码并提高效率!听说过关于SQLAlchemy的很棒的事情-一定会调查的!非常感谢。