我们正在尝试从mysql迁移到postgresql。我们正在使用正则表达式作为id,但是由于它与mysql兼容而无法正常工作。
用法:(resolvers.js)
Query: {
database: (root,{id,gId},{db,user}) => {
console.log('user is',user);
let conditions = computeIdAndgId(id,gId);
return db.Database.findOne({
where: {
[Op.and] : [{
id: {
[Op.notIRegexp]: '[0-9]'
}
},...conditions],tenant: user.tenant
},raw: true
});
}
}
最终出现以下错误
SequelizeDatabaseError: operator does not exist: integer ~ unknown
at Query.formatError (/node_modules/sequelize/lib/dialects/postgres/query.js:354:16)
at query.catch.err (/node_modules/sequelize/lib/dialects/postgres/query.js:71:18)
at tryCatcher (/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/node_modules/bluebird/js/release/promise.js:547:31)
at Promise._settlePromise (/node_modules/bluebird/js/release/promise.js:604:18)
at Promise._settlePromise0 (/node_modules/bluebird/js/release/promise.js:649:10)
at Promise._settlePromises (/node_modules/bluebird/js/release/promise.js:725:18)
at _drainQueueStep (/node_modules/bluebird/js/release/async.js:93:12)
at _drainQueue (/node_modules/bluebird/js/release/async.js:86:9)
at Async._drainQueues (//node_modules/bluebird/js/release/async.js:102:5)
at Immediate.Async.drainQueues (/node_modules/bluebird/js/release/async.js:15:14)
at runCallback (timers.js:789:20)
at tryOnImmediate (timers.js:751:5)
at processImmediate [as _immediateCallback] (timers.js:722:5)
这些是通过序列ORM为不同数据库形成的sql查询:
MYSQL查询(有效):
SELECT `id`,`name`,`username`,`password`,`type`
FROM `database` AS `database`
WHERE (`database`.`id` REGEXP '[0-9]' AND `database`.`id` = '1')
AND `database`.`tenant` = 1 LIMIT 1;
POSTGRESQL查询(不起作用):
SELECT "id","name","username","password","type"
FROM "database" AS "database"
WHERE ("database"."id" ~ '[0-9]' AND "database"."id" = '1')
AND "database"."tenant" = 1 LIMIT 1;