Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Upsert在postgresruby中的应用_Ruby_Pg - Fatal编程技术网

Upsert在postgresruby中的应用

Upsert在postgresruby中的应用,ruby,pg,Ruby,Pg,我已经看到了处理这个问题的其他问题,我知道PostgreSQL没有内置的upsert,必须使用2种方法来完成。这是我在Ruby中使用pg gem的代码 @db.exec_params("UPDATE crawled SET url = $1, timestamp = $2 WHERE url = $1",[url,DateTime.now]) @db.exec_params("INSERT INTO crawled (url, timestamp) VALUES ($1, $2) WHERE

我已经看到了处理这个问题的其他问题,我知道PostgreSQL没有内置的upsert,必须使用2种方法来完成。这是我在Ruby中使用pg gem的代码

@db.exec_params("UPDATE crawled SET url = $1, timestamp = $2 WHERE url = $1",[url,DateTime.now])

@db.exec_params("INSERT INTO crawled (url, timestamp) VALUES ($1, $2) WHERE NOT EXISTS 
              (SELECT 1 FROM crawled WHERE url = $1)",[url,DateTime.now])
但是,当我运行此命令时,会出现语法错误

exec_params': ERROR:  syntax error at or near "WHERE" (PG::Error)
LINE 1: ...ERT INTO crawled (url, timestamp) VALUES ($1, $2) WHERE NOT ...

我的错误在哪里?

看看你的例子,我有两个问题

哪一行是导致错误的原因

表应该被表名替换,不是吗

伪代码:

# transaction
query('BEGIN');

# find out if row already exists, and lock it if it does
result = query('SELECT * FROM crawled WHERE url = $1 FOR UPDATE', [url])

# row exists, so update it
if (result.rows > 0) {
    query('UPDATE crawled SET timestamp = $2 WHERE url = $1', [url, DateTime.now])
}

# row doesn't exist, insert
else {
    query('INSERT INTO crawled (url, timestamp) VALUES ($1, $2)', [url, DateTime.now])
}

# commit transaction
query('COMMIT');

@db.exec_参数插入表url,时间戳值$1,$2,如果不存在,请从url=1的表中选择1,[url,DateTime.now]这是导致错误的行。2是的,你是对的,在我的实际代码中,表被替换为表名。我将更新我的问题以反映这一点。在没有意义的地方插入+WHERE。是否要制作类似“插入影片”的内容,从tmp_films中选择*,其中日期_prod<'2004-05-07'?我在看第二个解决方案,是的,但它使用了一个SELECT语句,在where之前您缺少它!抢手货这似乎让我滑倒了,我一直坚持要有价值观。谢谢