最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

如何使用小写功能Sequelize的Postgres

IT培训 admin 9浏览 0评论

如何使用小写功能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”(而不是textcharacter 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”(而不是textcharacter 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定义首先定义表时。始终处于激活状态 - 你需要知道你要定义你的表什么时候做不区分大小写的搜索。

发布评论

评论列表 (0)

  1. 暂无评论