如何使用小写功能Sequelize的Postgres
我试图使用小写函数执行字符串搜索Sequelize。我管理使用想把它做到这一点。我的问题是如何使用小写功能在这种情况下?
使用ILIKE的findAll
是如下:
Db.models.Person.findAll(where: {firstName: {$ilike: `somename`}});
如何更改它lower(firstname) = lower('somename');
PostgreSQL的一般使用区分大小写的排序规则。这意味着出现在每个列数据对查询字面上比较。
您有几种选择:
1.按照本的答案,并包裹在一个sequelize.fn('lower')
打电话给你的包裹栏和数据库。
优点:没有数据库的变化。
缺点:您需要记住使用它的每个查询。 Foregoes指数(除非你已经创建了一个functional index)和顺序扫描表,从而导致更慢的样子上升与大表。相当冗长的代码。
2.使用ILIKE,以不区分大小写匹配模式
为准确找到该名称:
Db.models.Person.findAll(where: {firstName: {$iLike: 'name'}});
为了找到一个片段,它可以包含任意字符之内:
Db.models.Person.findAll(where: {firstName: {$iLike: '%name%'}});
优点:容易记住。没有Sequelize功能的包装 - 它是一个内置的操作,所以语法更加整洁。没有特殊的索引或数据库的更改需要。
缺点:速度慢,除非你开始喜欢pg_trgm扩展搞乱
3.与citext类型,它隐含比较小写定义你的文本列
定义你的列类型为“citext”(而不是text
或character varying
)有把这个相同的实际效果:
select * from people where name = 'DAVID'
这...
select * from people where LOWER(name) = LOWER('DAVID')
PostgreSQL文档显示这是如何与citext类型创建表的例子:
CREATE TABLE users (
nick CITEXT PRIMARY KEY,
pass TEXT NOT NULL
);
INSERT INTO users VALUES ( 'larry', md5(random()::text) );
INSERT INTO users VALUES ( 'Tom', md5(random()::text) );
INSERT INTO users VALUES ( 'Damian', md5(random()::text) );
INSERT INTO users VALUES ( 'NEAL', md5(random()::text) );
INSERT INTO users VALUES ( 'Bjørn', md5(random()::text) );
SELECT * FROM users WHERE nick = 'Larry';
TL; DR基本上是换出你的“文本”列“citext”。
该citext模块捆绑了PostgreSQL的8.4,所以没有必要安装任何扩展。但是,你需要启用它每次用下面的SQL使用数据库:
CREATE EXTENSION IF NOT EXISTS citext WITH SCHEMA public;
然后在您的Sequelize定义,定义type
属性:
// Assuming `Conn` is a new Sequelize instance
const Person = Conn.define('person', {
firstName: {
allowNull: false,
type: 'citext' // <-- this is the only change
}
});
然后你对那栏的搜索永远是不区分大小写定期where =
查询
优点:无需换你的查询中丑陋sequelize.fn
电话。无需记住明确小写。区域设置知道,在所有的字符集这样的作品。
缺点:您需要记住使用它在你的Sequelize定义首先定义表时。始终处于激活状态 - 你需要知道你要定义你的表什么时候做不区分大小写的搜索。
如何使用小写功能Sequelize的Postgres
我试图使用小写函数执行字符串搜索Sequelize。我管理使用想把它做到这一点。我的问题是如何使用小写功能在这种情况下?
使用ILIKE的findAll
是如下:
Db.models.Person.findAll(where: {firstName: {$ilike: `somename`}});
如何更改它lower(firstname) = lower('somename');
PostgreSQL的一般使用区分大小写的排序规则。这意味着出现在每个列数据对查询字面上比较。
您有几种选择:
1.按照本的答案,并包裹在一个sequelize.fn('lower')
打电话给你的包裹栏和数据库。
优点:没有数据库的变化。
缺点:您需要记住使用它的每个查询。 Foregoes指数(除非你已经创建了一个functional index)和顺序扫描表,从而导致更慢的样子上升与大表。相当冗长的代码。
2.使用ILIKE,以不区分大小写匹配模式
为准确找到该名称:
Db.models.Person.findAll(where: {firstName: {$iLike: 'name'}});
为了找到一个片段,它可以包含任意字符之内:
Db.models.Person.findAll(where: {firstName: {$iLike: '%name%'}});
优点:容易记住。没有Sequelize功能的包装 - 它是一个内置的操作,所以语法更加整洁。没有特殊的索引或数据库的更改需要。
缺点:速度慢,除非你开始喜欢pg_trgm扩展搞乱
3.与citext类型,它隐含比较小写定义你的文本列
定义你的列类型为“citext”(而不是text
或character varying
)有把这个相同的实际效果:
select * from people where name = 'DAVID'
这...
select * from people where LOWER(name) = LOWER('DAVID')
PostgreSQL文档显示这是如何与citext类型创建表的例子:
CREATE TABLE users (
nick CITEXT PRIMARY KEY,
pass TEXT NOT NULL
);
INSERT INTO users VALUES ( 'larry', md5(random()::text) );
INSERT INTO users VALUES ( 'Tom', md5(random()::text) );
INSERT INTO users VALUES ( 'Damian', md5(random()::text) );
INSERT INTO users VALUES ( 'NEAL', md5(random()::text) );
INSERT INTO users VALUES ( 'Bjørn', md5(random()::text) );
SELECT * FROM users WHERE nick = 'Larry';
TL; DR基本上是换出你的“文本”列“citext”。
该citext模块捆绑了PostgreSQL的8.4,所以没有必要安装任何扩展。但是,你需要启用它每次用下面的SQL使用数据库:
CREATE EXTENSION IF NOT EXISTS citext WITH SCHEMA public;
然后在您的Sequelize定义,定义type
属性:
// Assuming `Conn` is a new Sequelize instance
const Person = Conn.define('person', {
firstName: {
allowNull: false,
type: 'citext' // <-- this is the only change
}
});
然后你对那栏的搜索永远是不区分大小写定期where =
查询
优点:无需换你的查询中丑陋sequelize.fn
电话。无需记住明确小写。区域设置知道,在所有的字符集这样的作品。
缺点:您需要记住使用它在你的Sequelize定义首先定义表时。始终处于激活状态 - 你需要知道你要定义你的表什么时候做不区分大小写的搜索。