Saltar al contenido

Cómo usar la función de minúsculas en Sequelize Postgres

Ya no necesitas investigar más por todo internet porque estás al espacio correcto, contamos con la solución que quieres sin problema.

Solución:

PostgreSQL generalmente usa intercalaciones que distinguen entre mayúsculas y minúsculas. Esto significa que los datos que aparecen en cada columna se comparan literalmente con su consulta.

Tienes varias opciones:


1. Siga la respuesta de Ben y envuelva sus columnas y base de datos en un sequelize.fn('lower') llamar.

Pros: No hay cambios en la base de datos.

Contras: debe recordar usarlo para cada consulta. Renuncia a los índices (a menos que ya haya creado un índice funcional) y escanea las tablas secuencialmente, lo que resulta en búsquedas más lentas con tablas grandes. Código bastante detallado.


2. Use ILIKE, para hacer coincidir mayúsculas y minúsculas con un patrón

Para encontrar el nombre exactamente:

Db.models.Person.findAll(where: firstName: $iLike: 'name');

Para encontrar un fragmento, que puede estar contenido en caracteres arbitrarios:

Db.models.Person.findAll(where: firstName: $iLike: '%name%');

Pros: Fácil de recordar. Sin envoltorios de función Sequelize: es un operador incorporado, por lo que la sintaxis es más ordenada. No se requieren índices especiales ni cambios en la base de datos.

Contras: Lento, a menos que empieces a jugar con extensiones como pg_trgm


3. Defina sus columnas de texto con el tipo citext, que implícitamente compara minúsculas

Definir sus tipos de columna como ‘citext’ (en lugar de text o character varying) tiene el mismo efecto práctico de convertir esto:

select * from people where name = 'DAVID'

a esto…

select * from people where LOWER(name) = LOWER('DAVID')

La documentación de PostgreSQL muestra esto como un ejemplo de cómo crear su tabla con el tipo 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 básicamente cambia tus columnas de “texto” por “citext”.

El módulo citext viene incluido con PostgreSQL 8.4, por lo que no es necesario instalar ninguna extensión. Pero debe habilitarlo en cada base de datos que use con el siguiente SQL:

CREATE EXTENSION IF NOT EXISTS citext WITH SCHEMA public;

Y luego, en sus definiciones de Sequelize, defina un type attribute:

// Assuming `Conn` is a new Sequelize instance
const Person = Conn.define('person', 
  firstName: 
    allowNull: false,
    type: 'citext' // <-- this is the only change
  
);

Entonces sus búsquedas en esa columna siempre ser insensible a mayúsculas y minúsculas con regular where = consultas

Pros: No es necesario envolver sus consultas en feo sequelize.fn llamadas No es necesario recordar escribir minúsculas explícitamente. Consciente de la configuración regional, por lo que funciona en todos los juegos de caracteres.

Contras: debe recordar usarlo en sus definiciones de Sequelize cuando defina su tabla por primera vez. Siempre activado: debe saber que querrá realizar una búsqueda que no distinga entre mayúsculas y minúsculas al definir sus tablas.

Puede usar funciones nativas en la cláusula where:

Db.models.Person.findAll(
  where: sequelize.where(
    sequelize.fn('lower', sequelize.col('firstname')), 
    sequelize.fn('lower', 'somename')
  )
);

que se traduciría a

select * from person where lower(firstname) = lower('somename');

Comentarios y puntuaciones

Finalizando este artículo puedes encontrar las referencias de otros desarrolladores, tú de igual manera tienes la libertad de mostrar el tuyo si lo deseas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *