(10-05-2023, 22:26)Shell escribió: Supongo que es la que se suele usar.
Desde mi punto de vista los programas con bases de datos existes 3 situaciones bien definidas:
- Creación de tablas ( Exec +SQL )
- Alteración de tablas (gb.db)
- Destrucción de tablas (gb.db)
Por lo general en mis programas uso una sentencia SQL de creación de la base de datos que sucede una única vez, en la primera ejecución del programa. esta sentencia cambia a veces de acuerdo al motor de bases de datos que se usara pero para ello uso un método que convierte el SQL de SQLite en SQL PostgeSQL o MySQL, así solo hay que mantener un solo código SQL.
Luego el programa se limita a alterar las tablas existentes con los recursos de gambas así no hay que hacer código especial para cada motor de bases de datos.
Eejemplo de creación con SQLite.
Código:
BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS "artists" (
"idx" INTEGER,
"name" TEXT NOT NULL UNIQUE,
"countries" INTEGER NOT NULL DEFAULT 1,
FOREIGN KEY ("countries") REFERENCES "countries" ("idx"),
PRIMARY KEY("idx" AUTOINCREMENT)
);
CREATE TABLE IF NOT EXISTS "albums" (
"idx" INTEGER,
"name" TEXT NOT NULL UNIQUE,
"year" INTEGER NOT NULL DEFAULT 0,
"artist" INTEGER NOT NULL DEFAULT 1,
FOREIGN KEY ("artist") REFERENCES "artists" ("idx"),
PRIMARY KEY("idx" AUTOINCREMENT)
);
COMMIT;
Ejemplo para MySQL
Código:
CREATE TABLE `files`
(
`idx` INT AUTO_INCREMENT,
`ino` VARCHAR(255),
`ftime` INT,
`fsize` INT,
`fpath` VARCHAR(255),
PRIMARY KEY(idx)
);
CREATE TABLE `artists`
(
`idx` INT AUTO_INCREMENT,
`name` VARCHAR(255),
`countries` INT,
PRIMARY KEY(idx),
FOREIGN KEY (`countries`) REFERENCES countries(`idx`)
);
CREATE TABLE `albums`
(
`idx` INT AUTO_INCREMENT,
`name` VARCHAR(255),
`year` INT,
`artist` INT,
PRIMARY KEY(idx),
FOREIGN KEY (`artist`) REFERENCES artists(`idx`)
);
Nota: Este ultimo código no esta testeado en MySQL pero si a alguien le interesa el tema y dispone de un servidor MySQL para hacer pruebas podríamos exoperimentar y afinar el código.