从一个csv更新多个表并在update_or_insert之后获取行ID

时间:2018-08-01 08:57:54

标签: web2py

我正在尝试构建.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:方法

1 个答案:

答案 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文件中所有可用的字段都已用于查找匹配项(即,没有其他需要更新其值的字段。