【发布时间】:2015-11-09 03:20:05
【问题描述】:
我收到如下错误消息,当我像其他人一样创建此表时设置列时间戳timestamp without time zone NOT NULL,但是当我尝试将2015-08-16 18:51:05 插入此表时,我得到错误,但其他表工作,为什么以及如何解决?
CREATE TABLE IF NOT EXISTS "UserForgetPasswordPending"(
"UserForgetPasswordPendingId" SERIAL NOT NULL,
"Email" varchar(50) NOT NULL,
"TokenTimestamp" timestamp without time zone NOT NULL,
"Token" varchar(100) NOT NULL,
PRIMARY KEY ("UserForgetPasswordPendingId")
);
ALTER TABLE "UserForgetPasswordPending"
OWNER TO db_admin;
错误
[error: column "TokenTimestamp" is of type timestamp without time zone but expression is of type integer]
name: 'error',
length: 216,
severity: 'ERROR',
code: '42804',
detail: undefined,
hint: 'You will need to rewrite or cast the expression.',
插入
var utc = moment(new Date()).unix();
var tokenTimestamp = moment.unix(utc).format('YYYY-MM-DD HH:mm:ss');
var upsertUserForgetPasswordPending = function(userEmail, tokenTimestamp, token) {
return new Promise(function (fulfill, reject){
var queryInsert = 'INSERT INTO "UserForgetPasswordPending" ("Email","TokenTimestamp","Token") SELECT $1,2,$3';
var queryUpsert = 'UPDATE "UserForgetPasswordPending" SET "TokenTimestamp" = $2, "Token" = $3 WHERE "Email" = $1';
var query = 'WITH upsert AS ('+queryUpsert+' RETURNING *) '+queryInsert+' WHERE NOT EXISTS (SELECT * FROM upsert)';
console.log(tokenTimestamp);
dbClient.query(query, [userEmail,tokenTimestamp,token], function(error, result) {
if (error) {
reject(error);
} else {
fulfill(result);
}
});
});
};
【问题讨论】:
-
请显示您正在使用的准确
insert语句。不相关,但是:使用带引号的标识符通常会产生比它们值得的问题更多的问题。 -
@a_horse_with_no_name 我更新了我使用的插入函数,引用标识符是什么意思?你的意思是在查询中我使用类似
CREATE TABLE IF NOT EXISTS "UserForgetPasswordPending" ..的东西吗?那是因为我使用大写命名... -
那是什么编程语言?变量
tokenTimestamp是什么数据类型?好像你在那里传递一个整数值,而不是时间戳。我指的是在标识符周围使用双引号,这使得它们区分大小写。从长远来看,这通常会产生更多值得的问题(有些人首先质疑引用标识符的“价值”)。 -
我不知道 JavaScript 是如何传递变量的,用普通的 SQL 写就可以了:sqlfiddle.com/#!15/bfd35/1 可能是因为你在 INSERT 语句中使用了
select而不是values,但是我不知道 JavaScript 是否会以某种方式搞砸。 -
你打错了:
SELECT $1,2,$3应该是SELECT $1,$2,$3。
标签: javascript sql node.js postgresql