#sails.js #waterline #heroku-postgres #sails-postgresql
#sails.js #ватерлиния #heroku-postgres #sails-postgresql
Вопрос:
Я не могу получить поиск без учета регистра из базы данных с помощью Sails.js Версия V1.0 ORM ватерлинии. Я использую адаптер sails-postgresql. Запущенной средой является Heroku Heroku PostgreSQL.
Есть ли какой-либо способ отключить следующую настройку в адаптере базы данных — По соображениям производительности, чувствительность к регистру содержимого зависит от адаптера базы данных.
Попробовал метод:
Конфигурация хранилища данных:
default: {
adapter: 'sails-postgresql',
url: 'postgres://....',
ssl: true,
wlNext: {
caseSensitive: true
}
}
Блок кода является:
var meetings = await Meeting.find({
select: ['id', 'uid', 'name', 'deleted', 'complete'],
where: {
owner: user.id,
name: { contains: searchJson.name } : ""
},
skip: (inputs.page > 0) ? (inputs.page) : 0,
limit: (inputs.limit > 0) ? (inputs.limit) : 10,
sort: 'date DESC'
});
Ответ №1:
Самый простой способ, который я нашел для обработки этого и не зависящих от регистра уникальных индексов с помощью PG / Sails, — это использовать тип столбца citext вместо text
/ character varying
types (по сравнению с принудительным вводом всего в нижний регистр, который воняет).
citext
текстовый тип данных без учета регистра. «По сути, он внутренне вызывает lower при сравнении значений. В противном случае он ведет себя почти точно так же, как текст.»
Пример атрибута модели, извлеченный из рабочего приложения:
username: {
type: 'string',
columnType: 'citext',
required: true,
unique: true,
description: 'A users.. Username',
// ...
},
Согласно этому (несколько устаревшему) Страница Heroku docs похоже, что это должно сработать, но вам может потребоваться сначала выполнить поиск create extension citext;
в вашей базе данных.
Комментарии:
1. Какой вариант у нас есть с Sails версии v1.2.4 и mongodb?
2. Столкнулся с аналогичной проблемой, но также у materialized views были зависимости от таблицы, в которой я хотел изменить тип столбца. В этом случае вам нужно удалить материализованные представления, затем обновить столбец таблицы с помощью приведенной ниже команды: «ALTER TABLE имя_таблицы ALTER COLUMN имя_столбца TYPE citext;» и после этого воссоздать материализованные представления, которые были удалены ранее.
Ответ №2:
Для MongoDB https://github.com/balderdashy/sails/issues/7014. Из sails-mongo@1.2.0 вы можете использовать .meta({makeLikeModifierCaseInsensitive: true}) для запроса без учета регистра. Пример
await User.find(criteria).meta({makeLikeModifierCaseInsensitive: true});
Ответ №3:
Вы можете использовать собственные запросы, например:
const eventTypesRows = await Meeting.getDatastore()
.sendNativeQuery(`SELECT "name" FROM meeting WHERE LOWER(name) = LOWER($1)`, [searchName]);