¿CodeIgniter 4 Facilita el Cambio entre MariaDB y PostgreSQL?
Basándonos en nuestra experiencia, la respuesta es afirmativa. Los archivos de migración se ejecutaron exitosamente tanto en MariaDB como en PostgreSQL, creando todas las tablas e insertando los datos de los seeders. Esto nos representó un ahorro significativo de tiempo en ese proceso.
Para configurar la base de datos en nuestro archivo database, la estructura debe ser la siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | public array $default = [
'DSN' => '',
'hostname' => '127.0.0.1', // Cambia a la dirección de tu servidor PostgreSQL si es diferente
'username' => 'postgres', // Reemplaza con tu nombre de usuario de PostgreSQL
'password' => 'contraseña', // Reemplaza con tu contraseña de PostgreSQL
'database' => 'pos', // Reemplaza con el nombre de tu base de datos PostgreSQL
'DBDriver' => 'Postgre', // Cambia el Driver a 'Postgre'
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => true,
'charset' => 'utf8',
'swapPre' => '',
'encrypt' => false,
'failover' => [],
'port' => 5432, // El puerto por defecto de PostgreSQL es 5432
'schema' => 'public', // El esquema por defecto en PostgreSQL es 'public'
'dateFormat' => [
'date' => 'Y-m-d',
'datetime' => 'Y-m-d H:i:s',
'time' => 'H:i:s',
],
];
|
Surgieron inconvenientes en el modelo debido a la incompatibilidad en el manejo de nombres de columna en subconsultas entre PostgreSQL y MariaDB. PostgreSQL exige el uso de comillas en la cláusula WHERE, lo que causaba fallos en MariaDB. La solución implementada consistió en adaptar dinámicamente la sentencia SQL según el motor de base de datos detectado. Un ejemplo de esta adaptación es:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | public function usuariosPorEmpresa($empresa) {
$empresa = $this->usuarios->db->escapeString($empresa);
$nombreUsuariosEmpresa = $this->usuariosEmpresa->db->prefixTable("usuariosempresa");
$tablaUsuariosNombre = $this->usuarios->db->prefixTable("users");
$db = \Config\Database::connect();
if ($db->DBDriver === 'pgsql' || $db->DBDriver === 'PDO\Postgres' || $db->DBDriver === 'Postgre') {
$usuarios = $this->usuarios->select("u.id as id, u.username as username, {$empresa} as idEmpresa")
->select("COALESCE((SELECT ue.status
FROM {$nombreUsuariosEmpresa} ue
WHERE \"ue\".\"idUsuario\" = u.id
AND \"ue\".\"idEmpresa\" = {$empresa}), 'off') AS status")
->select("COALESCE((SELECT ue.id
FROM {$nombreUsuariosEmpresa} ue
WHERE \"ue\".\"idUsuario\" = u.id
AND \"ue\".\"idEmpresa\" = {$empresa}), 0) AS idnombreempresa")
->from("{$tablaUsuariosNombre} u")
->where("u.deleted_at", null)
->groupBy("u.id"); // Agrega esta línea para evitar la repetición de usuarios
} else {
$usuarios = $this->usuarios->select("u.id as id, u.username as username, {$empresa} as idEmpresa")
->select("COALESCE((SELECT ue.status
FROM {$nombreUsuariosEmpresa} ue
WHERE ue.idUsuario = u.id
AND ue.idEmpresa = {$empresa}), 'off') AS status")
->select("COALESCE((SELECT ue.id
FROM {$nombreUsuariosEmpresa} ue
WHERE ue.idUsuario = u.id
AND ue.idEmpresa = {$empresa}), 0) AS idnombreempresa")
->from("{$tablaUsuariosNombre} u")
->where("u.deleted_at", null)
->groupBy("u.id"); // Agrega esta línea para evitar la repetición de usuarios
}
$db->close();
return \Hermawan\DataTables\DataTable::of($usuarios)->toJson(true);
|
Adicionalmente, la mayor rigidez de PostgreSQL en la validación de la longitud de los campos generó errores al intentar insertar cadenas que excedían la capacidad definida. Esto requirió aumentar el tamaño del campo correspondiente, un comportamiento laxo en MariaDB que no reportaba tales inconsistencias.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <?php namespace App\Database\Migrations; use CodeIgniter\Database\Migration; class AlterLogTableDescription extends Migration { public function up() { $this->forge->modifyColumn('log', [ 'description' => ['type' => 'text', 'null' => false], // Cambiado a 'text' ]); } public function down() { $this->forge->modifyColumn('log', [ 'description' => ['type' => 'varchar', 'constraint' => 256, 'null' => false], // Revertir al estado anterior ]); } } |

Comentarios
Publicar un comentario