Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-11-2022
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 20
amadis Va por buen camino
Cita:
Empezado por mamcx Ver Mensaje
Yo uso un sistema muy simple.

Incrusto como una constante el archivo con las migraciones dentro del .exe, en este formato:


Código SQL [-]
--version: 2

DROP TRIGGER IF EXISTS visit_code_update_tg ON payment;

--version: 3
ALTER TABLE doc_codes
ADD COLUMN doc_code  TEXT PRIMARY KEY DEFAULT generate_ulid() CHECK (not_empty(doc_code));

Eso lo comparo contra la version de la BD y simplemente es partir el archivo, chequear la version y recorrerlo.
Podrias compartir un poco mas sobre como haces la comparacion y el archivo con las constantes.?

En cuanto a la logica para el chequeo, se me ocurre en el source, del form principal, luego de crear los datos y conexion a bd.

Código Delphi [-]
IF tablafirebird.DBVERSION < VERACTUAL
then actualiza
else ejecuta el programa

Mi procedure Actualiza lo vengo haciendo asi
pero es un lio
Código Delphi [-]
If dbversion = 2 then Actaliza3;
If dbversion = 3 then Actaliza4;
If dbversion = x then Actalizax+1;
// asi tengo tantas lineas If ejecutando procedures como versiones

Cada procedure carga en un TFDQuery las sentencia SQL necesarias para actualizar a la version en cuestión.

Funciona, pero me parece que no es prolijo.
Responder Con Cita
  #2  
Antiguo 17-11-2022
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.913
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por amadis Ver Mensaje
Podrias compartir un poco mas sobre como haces la comparacion y el archivo con las constantes.?
Lo hago en otros lenguajes pero quizás la forma mas simple en Delphi es ponerlo en un TMemo y copiar ahi el SQL.


Cita:
Empezado por amadis Ver Mensaje
En cuanto a la logica para el chequeo, se me ocurre en el source, del form principal, luego de crear los datos y conexion a bd.

De hecho, yo lo pongo como una función de la BD:

Código SQL [-]
CREATE OR REPLACE FUNCTION db_master_version(OUT RETURNS INTEGER)
AS $$
BEGIN
  RETURNS = 2;
END;
$$
LANGUAGE plpgsql;

Para la logica, lo que hago es que hago in split del SQL en cada "GO"

Código SQL [-]
--version: 2

DROP TRIGGER IF EXISTS visit_code_update_tg ON payment;

GO

--version: 3
ALTER TABLE doc_codes
ADD COLUMN doc_code  TEXT PRIMARY KEY DEFAULT generate_ulid() CHECK (not_empty(doc_code));

GO

Y parser el segmento de "version". Esto es rust pero la lógica creo se entiende:

Código PHP:
// of es el SQL con los comandos de DB
pub fn load_cmds(of: &str) -> Vec<CmdDB> {
    
let mut cmd Vec::new();
    
let mut sql CmdDB {
        
version0,
        
sql"".to_string(),
    };

    
// Recorro por lineas
    
for line in of.lines() {
        
// Al encontrar esto, paseo el numero como un integer
        
if line.starts_with("--name:") {
            
sql.version line.replace("--name:""").trim().parse().unwrap();
            
sql.sql.clear();
            continue;
        };
        
// Acumulo el SQL hasta que encuentro el GO
        
if line.starts_with("GO") {
            
cmd.push(sql.clone())
        } else {
            
sql.sql += &format!("{}\n"line);
        }
    }
    
// Retorno los comandos partidos por version
    
cmd
}

//Se ven asi:

CmdDB {
        
version2,
        
sql"
DROP TRIGGER IF EXISTS visit_code_update_tg ON payment;

"
}; 
__________________
El malabarista.
Responder Con Cita
  #3  
Antiguo 22-11-2022
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 20
amadis Va por buen camino
Que tal colegas, finalmente le he dado un giro a todo este tema y lo he resuelto de la siguiente manera, que me resulta transparente para chequear y agregar cambios y practico.

A todo lo planteado anteriormente lo reoslvi, creando una tabla SQLITE con un campo ID (UNTEGER) y STRING (BLOB).
En el ID voy agregando el Nº de version de la base de datos, y en el campo STRING, agrego el string SQL necesario para pasar de la version anterior.

Suponiendo que la version inicial es 1

en la tabla tengo

Código SQL [-]
2  |  ALTER TABLE CLIENTES
       ADD INACTIVO BOOLEAN
       DEFAULT FALSE

A la tabla Sqlite le iré agregando todos los cambios siguientes

Luego en delphi, DESCARGO A ARCHIVO EL SQLITE.DB

Código Delphi [-]
VAR
 ResStream: TResourceStream;

begin
        // guardo dbversion

 ResStream := TResourceStream.Create(HInstance, 'DBVER', RT_RCDATA);
  try
    ResStream.Position := 0;
    ResStream.SaveToFile('DbVer.db');
    finally
    ResStream.Free;
  end;

luego de crear el programa, cargo a un query el archivo sqlite


Hago una consulta para obtener el Nº de version actual y lo guardo en la variable DBVer

y luego ejecuto una funcion que hace todo el chequeo y luego continua la carga del sistema

Código Delphi [-]

Function TDatos.VersionBD : boolean;
var
 MaxVer : integer;

begin

DMVersion.QVersion.Last;   //query que esta en un datamodule de control de version este es el que tiene la tabla SQLITE se abre al iniciar y carga toda la taba
MaxVer := DMVersion.QVersionID.Value;

if DBVer < MaxVer
  then
    begin
     if MessageDlg('Su versión de la Base de Datos es :'+ Inttostr(DbVer)+' y la esperada por el Sistema es : '+InttoStr(MaxVer)+#10#13+
     '¿Desea actulizar la Base de datos antes de continuar?',MtInformation,[mbyes,mbno],0)=mryes
      then
        begin
            while DBVer < MaxVer
            do
               begin  // aqui tengo otro query  conectado a firebird con transaccion update que se encargara de hacer los cambios
               DmVersion.QVersion.Locate('ID',DbVer+1);
                QactDB.Connection.StartTransaction;
                QactDB.SQL.Clear;
                 Try
                   QactDB.SQL.Append(Dmversion.QVersionSTRING.Value);
                   QactDB.OpenOrExecute;
                   QactDB.Close;
                   QactDB.SQL.Clear;
                   QactDB.SQL.Append('update config set version = :v');
                   QactDB.ParamByName('v').AsInteger := DmVersion.QVersionID.Value;
                   QactDB.OpenOrExecute;
                   QactDB.Connection.Commit;
                   DbVer := DmVersion.QVersionID.Value;
                 
                  Except
                   On E: Exception
                    do
                      begin
                        QactDB.Connection.Rollback;     
                        MessageDlg('No se ha podido actualizar a la Version :'+DmVersion.QVersionID.AsString+#10#13+
                        E.Message,mterror,[mbok],0);
                        Break;
                      end;


                 End;
               end;
        end;
    end;
result := true;

De esa forma he resuelto sin tener que parsear textos ni recorrer archivos manualmente

Cada vez que agrego un cambio debo agregar a los recursos del ejecutable la nueva tabla SQLITE con los cambios

Espero sirva de ayuda

Gracias a todos por sus aportes
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
[FireDAC] Desconexión a la Base de Datos MAXIUM Conexión con bases de datos 4 14-06-2021 20:12:59
Filtrar Base de Datos FireDac pokexperto1 Conexión con bases de datos 6 03-10-2015 00:26:07
Controlar Cambios en la Base de Datos afunez2007 MS SQL Server 5 12-07-2013 18:04:12
Chequear integridad base de datos Toni Firebird e Interbase 4 09-01-2013 20:02:34
Como hacer conexión de una base de datos en firebird. Niiña Conexión con bases de datos 5 28-11-2011 22:43:04


La franja horaria es GMT +2. Ahora son las 01:44:50.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi