在web2py中批量插入或更新

时间:2014-08-19 09:27:05

标签: web2py

我知道web2py中有bulk_insertinsert_or_update等方法。前者一次插入多个记录,而后者处理重复的主/唯一密钥插入条件(ON DUPLICATE KEY UPDATE)。我想进行批量插入,同时确保重复键条件。 web2py中有bulk_insert_or_update之类的内容吗?如果没有,我怎么能实现它?

我写了以下查询,我想使用bulk_insert_or_update

之类的内容
db.mcexlinker.insert_or_update(
db(db.mcex.example.like(‘%’+db.mc.element+’%’)).select(db.mc.id,db.mcex.id)
)

更新

我的表格定义如下:

CREATE TABLE `mc` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `element` varchar(30) NOT NULL,
  `locale` int(11) NOT NULL,
  `synind` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_mc_locale` (`locale`),
  KEY `fk_mc_synind` (`synind`),
  CONSTRAINT `fk_mc_synind` FOREIGN KEY (`synind`) REFERENCES `mc` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_mc_locale` FOREIGN KEY (`locale`) REFERENCES `locale` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=84 DEFAULT CHARSET=latin1;

CREATE TABLE `mcex` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `example` varchar(200) NOT NULL,
  `ranking` int(11) DEFAULT NULL,
  `enteredby` int(11) DEFAULT NULL,
  `verificationstatus` int(11) DEFAULT '0' COMMENT '0-unverified,1-verified',
  PRIMARY KEY (`id`),
  UNIQUE KEY `example_UNIQUE` (`example`)
) ENGINE=InnoDB AUTO_INCREMENT=6233 DEFAULT CHARSET=latin1;

CREATE TABLE `mcexlinker` (
  `id` int(11) NOT NULL,
  `mcid` int(11) NOT NULL,
  `exampleid` int(11) NOT NULL,
  `linkstatus` int(11) NOT NULL COMMENT '0-new,1-verified',
  PRIMARY KEY (`id`),
  KEY `fk_mclinker_element` (`mcid`),
  KEY `fk_mcexlinker_example` (`exampleid`),
  CONSTRAINT `fk_mcexlinker_element` FOREIGN KEY (`mcid`) REFERENCES `mc` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_mcexlinker_example` FOREIGN KEY (`exampleid`) REFERENCES `mcex` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

表mc和mcex通过mcexlinker表链接以具有多对多关系。 表mc和mcex将独立填充。在某些时候,通过检查看起来像元素(mc table-element column)的示例(mcex table-example column)并获取它们的id并将它们插入到mcexlinker表中,预定作业将运行并链接这些表中的新条目。如果您需要更多信息,请与我们联系。

2 个答案:

答案 0 :(得分:1)

除非您使用的是Google App Engine,否则使用bulk_insert而不是简单地循环和执行单个插入是没有任何优势的。所以,您也可以在循环或列表推导中使用update_or_insert

此外,‘%’+db.mc.element+’%’无效,因为dc.mc.elementField对象,而不是字符串。

<强>更新

根据您更新的问题,您可以使用this solution,但如果您不希望它与数据库相关,您可以在Python中进行如下循环:

for example in db(db.mcex).select(db.mcex.id, db.mcex.example):
    matches = db(db.mc.element.contains(example.example)).select(db.mc.id)
    for match in matches:
        db.mcexlinker.update_or_insert(mcid=match.id, exampleid=example.id)

您还可以进行一些测试,看看在Python中进行匹配是否更有效:

elements = db(db.mc).select(db.mc.id, db.mc.element)
for example in db(db.mcex).select(db.mcex.id, db.mcex.example):
    for element in elements:
        if example.example in element.element:
            db.mcexlinker.update_or_insert(mcid=element.id, exampleid=example.id)

答案 1 :(得分:0)

你可以试试这个:

http://127.0.0.1:8000/Melinastoreservice/default/test?data={'name':'emma','age':'23'},{'name':'emma','age':'23'}

@request.restful()
def test():
    response.view = 'generic.json'

    response.headers["Access-Control-Allow-Origin"] = '*'
    response.headers['Access-Control-Max-Age'] = 86400
    response.headers['Access-Control-Allow-Headers'] = '*'
    response.headers['Access-Control-Allow-Methods'] = '*'
    response.headers['Access-Control-Allow-Credentials'] = 'true'

    def GET(data):

        import ast

        sett = ast.literal_eval(data)

        save = db.test.bulk_insert(sett)

        return response.json(save)

    return locals()