我正在尝试构建.csv数据上传工具,该工具将按顺序更新两个表。因此,我有一个与“事物”表具有一对多关系的“人”表,即一个人可以拥有许多不同的事物。
我需要做的是在'update_or_insert'之后从'person'行获取主键,然后此ID将进入'thing'表中相应行的'owner_id'。
关于我该怎么做的任何想法?打扰一下,我是个初学者!
模型
db.define_table('person',
Field('name'),
Field('age'),
Field('country'),
format='%(name)s')
db.define_table('thing',
Field('thing_name'),
Field('value'),
Field('location'),
Field('owner_id'))
控制器
导入csv
def importer():
form = FORM(INPUT(_type='submit',_class="btn btn-primary"))
if form.process().accepted:
with open('C:/Users/matt/PycharmProjects/all_projects/web2py/applications/uploadTest/private/test.csv') as csvfile:
readCSV = csv.reader(csvfile, delimiter=',')
next(readCSV, None)
for row in readCSV:
name = row[0]
age = row[1]
country = row[2]
thing_name = row[3]
value = row[4]
location = row[5]
db.person.update_or_insert(name=name,age=age, country=country)
db.thing.insert(thing_name=thing_name,value=value,location=location)
return dict(form=form)
以及以下数据
person.name,person.age,person.country,thing.name,thing.value,thing.location
matt,38,uk,teddy,12,house
matt,38,uk,kite,13,outside
matt,38,uk,screen,14,shed
matt,38,uk,teddy,15,garden
will,24,us,table,16,house
will,24,us,teddy,17,outside
will,24,us,kite,18,shed
will,24,us,screen,19,garden
pete,56,bel,teddy,20,house
pete,56,bel,table,21,outside
pete,56,bel,teddy,22,shed
pete,56,bel,kite,23,garden
pete,56,bel,screen,24,house
pete,56,bel,teddy,25,outside
matt,38,aus,teddy,26,shed
matt,38,can,kite,27,garden
matt,38,fr,screen,23,shed
pete,25,bel,teddy,22,shed
pete,25,bel,screen,74,shed
ps-我尚未在本地获取文件,因为我还没有制定出.retrieve:方法
答案 0 :(得分:0)
.update_or_insert
在更新的情况下不会返回记录ID,因此您不能使用该方法。相反,只需检查并获取记录以获取其ID。例如:
for row in readCSV:
person = dict(zip(('name', 'age', 'country'), row[:3]))
record = db.person(**person) # Check for a match.
person_id = record.id if record else db.person.insert(**person)
thing = dict(zip('thing_name', 'value', 'location'), row[3:6])
db.thing.insert(owner_id=person_id, **thing)
请注意,db.person(**person)
语法返回与person
字典中的所有值都匹配的第一条记录(假定给定数据,您期望最多匹配一个)或None
(如果有)不匹配(有关详细信息,请参见documentation)。
此外,请注意,如果存在匹配的db.person
记录,则无需更新它,因为CSV文件中所有可用的字段都已用于查找匹配项(即,没有其他需要更新其值的字段。