navbar_vertical_CRUD/
├── app.py
├── nexus.db
└── templates/
    ├── base.html
    ├── index.html
    ├── explorar.html
    ├── contacto.html
    └── campus/          ← esta carpeta debe existir aquí
        ├── list.html
        └── form.html


Adminer acceso
http://10.76.243.137:5001/
System: SQLite 3
Username: <empty>
Password: p4ssw0rd
Database: /db/pyfleet.db



pip install -r requirements.txt
python app.py
# → http://127.0.0.1:5000

gunicorn -w 2 -b 0.0.0.0:5000 app:app

Ejecutar con Python en segundo plano 
nohup python app.py > flask.log 2>&1 &
Comprobar que esta activo
ps aux | grep python
Para detenerlo
pkill -f "Python app.py"

Gunicorn en segundo plano.
gunicorn -w 4 -b 0.0.0.0:5000 app:app > gunicorn.log 2>&1 &
nohup gunicorn -w 4 -b 127.0.0.1:5000 app:app > gunicorn.log 2>&1 &
Parar
ps aux | grep gunicorn	 (averiguar proceso)	  
pkill -f gunicorn. (nombre proceso)
kill 12345. (Numero proceso)




PRODUCCION LINUX GUNICORN
pip install gunicorn
gunicorn app:app
gunicorn -w 2 -b 0.0.0.0:5000 app:app
gunicorn --bind 0.0.0.0:5000 app:app

gunicorn -w 4 -b 127.0.0.1:8000 app:app
gunicorn --workers 4 --bind 0.0.0.0:8000 app:app
gunicorn --workers 4 --bind 0.0.0.0:8000 --timeout 120 app:app

PRODUCCION WINDOWS WAITRESS
pip install waitress
waitress-serve --host=0.0.0.0 --port=8000 app:app


para Gunicorn

ps aux | grep gunicorn    averigua el proceso que lo usa
kill 1337144     	la primera de la lista

pkill -f "gunicorn.*app:app  lo elimina de una sola vez 

 

---------------------------------------------------------------

TABLAS

CREATE TABLE "vehiculos" (
	"id"	INTEGER,
	"m_oficial"	TEXT,
	"m_reservada"	TEXT,
	"m_propia"	TEXT,
	"VIN"	TEXT,
	"poliza"	TEXT,
	"viat"	TEXT,
	"legajo"	TEXT,
	"marca"	TEXT,
	"modelo"	TEXT,
	"tipo"	TEXT,
	"denominacion"	TEXT,
	"color"	REAL,
	"combustible"	TEXT,
	"plazas"	TEXT,
	"lanzadestellos"	INTEGER,
	"situacion"	TEXT,
	"poblacion"	TEXT,
	"unidad"	TEXT,
	"grupo"	TEXT,
	"int_operacion"	TEXT,
	"int_grupo"	TEXT,
	"int_juzgado"	TEXT,
	"int_procedimiento"	INTEGER,
	"f_destino_situacion"	INTEGER,
	"f_alta"	TEXT,
	"f_baja"	INTEGER,
	"km"	TEXT,
	"km_1"	TEXT,
	"itv_ultima"	INTEGER,
	"itv"	INTEGER,
	"observaciones"	TEXT,
	"historial"	TEXT,
	"notas"	TEXT, pdf TEXT,
	PRIMARY KEY("id" AUTOINCREMENT)
)


CREATE TABLE documentos (
            id          INTEGER PRIMARY KEY AUTOINCREMENT,
            vehiculo_id INTEGER NOT NULL REFERENCES vehiculos(id) ON DELETE CASCADE,
            nombre      TEXT,
            filename    TEXT NOT NULL,
            fecha       DATETIME DEFAULT (datetime('now','localtime'))
        )

CREATE TABLE "historial" (
	"id"	INTEGER,
	"vehiculo_id"	INTEGER,
	"fecha"	TEXT,
	"matricula"	TEXT,
	"situacion"	TEXT,
	"poblacion"	TEXT,
	"unidad"	TEXT,
	"grupo"	TEXT,
	"observaciones"	TEXT,
	PRIMARY KEY("id" AUTOINCREMENT),
	FOREIGN KEY("vehiculo_id") REFERENCES "vehiculos"("id")
)

CREATE TABLE mensajes (
            id        INTEGER PRIMARY KEY AUTOINCREMENT,
            texto     TEXT    NOT NULL,
            autor     TEXT,
            fecha     DATETIME DEFAULT (datetime('now','localtime'))
        )


-----------------------------------------
Cambiar nombre de columna

ALTER TABLE nombre_tabla
RENAME COLUMN nombre_actual TO nombre_nuevo;

Eliminar columna (hay que hacerlo de una en una (SQLite no permite varias a la vez)
ALTER TABLE usuarios
DROP COLUMN nombre;




Cambiar None por Null table vehiculos
UPDATE vehiculos
SET
    m_oficial = NULLIF(m_oficial, 'None'),
    m_civil = NULLIF(m_civil, 'None'),
    m_propia = NULLIF(m_propia, 'None'),
    VIN = NULLIF(VIN, 'None'),
    poliza = NULLIF(poliza, 'None'),
    viat = NULLIF(viat, 'None'),
    legajo = NULLIF(legajo, 'None'),
    marca = NULLIF(marca, 'None'),
    modelo = NULLIF(modelo, 'None'),
    tipo = NULLIF(tipo, 'None'),
    denominacion = NULLIF(denominacion, 'None'),
    cilindrada = NULLIF(cilindrada, 'None'),
    potencia = NULLIF(potencia, 'None'),
    combustible = NULLIF(combustible, 'None'),
    neumaticos = NULLIF(neumaticos, 'None'),
    plazas = NULLIF(plazas, 'None'),
    situacion = NULLIF(situacion, 'None'),
    poblacion = NULLIF(poblacion, 'None'),
    unidad = NULLIF(unidad, 'None'),
    grupo = NULLIF(grupo, 'None'),
    int_operacion = NULLIF(int_operacion, 'None'),
    int_grupo = NULLIF(int_grupo, 'None'),
    int_juzgado = NULLIF(int_juzgado, 'None'),
    f_alta = NULLIF(f_alta, 'None'),
    observaciones = NULLIF(observaciones, 'None'),
    historial = NULLIF(historial, 'None'),
    notas = NULLIF(notas, 'None');


UPDATE vehiculos
SET
    m_oficial = REPLACE(m_oficial, 'None', ''),
    m_civil = REPLACE(m_civil, 'None', ''),
    m_propia = REPLACE(m_propia, 'None', ''),
    VIN = REPLACE(VIN, 'None', ''),
    poliza = REPLACE(poliza, 'None', ''),
    viat = REPLACE(viat, 'None', ''),
    legajo = REPLACE(legajo, 'None', ''),
    marca = REPLACE(marca, 'None', ''),
    modelo = REPLACE(modelo, 'None', ''),
    tipo = REPLACE(tipo, 'None', ''),
    denominacion = REPLACE(denominacion, 'None', ''),
    cilindrada = REPLACE(cilindrada, 'None', ''),
    potencia = REPLACE(potencia, 'None', ''),
    combustible = REPLACE(combustible, 'None', ''),
    neumaticos = REPLACE(neumaticos, 'None', ''),
    plazas = REPLACE(plazas, 'None', ''),
    situacion = REPLACE(situacion, 'None', ''),
    poblacion = REPLACE(poblacion, 'None', ''),
    unidad = REPLACE(unidad, 'None', ''),
    grupo = REPLACE(grupo, 'None', ''),
    int_operacion = REPLACE(int_operacion, 'None', ''),
    int_grupo = REPLACE(int_grupo, 'None', ''),
    int_juzgado = REPLACE(int_juzgado, 'None', ''),
    f_alta = REPLACE(f_alta, 'None', ''),
    observaciones = REPLACE(observaciones, 'None', ''),
    historial = REPLACE(historial, 'None', ''),
    notas = REPLACE(notas, 'None', '');

----------------


CREATE TABLE categorias (
            id   INTEGER PRIMARY KEY AUTOINCREMENT,
            tipo TEXT    NOT NULL UNIQUE
        )

CREATE TABLE "historial" (
	"id"	INTEGER,
	"matricula"	TEXT,
	"unidad"	TEXT,
	"fecha"	TEXT,
	"observaciones"	TEXT,
	PRIMARY KEY("id" AUTOINCREMENT)
)

CREATE TABLE "unidades" (
	"unidad"	TEXT
)


Actualización vial
UPDATE vehiculos
SET viat = substr(
    notas,
    instr(lower(notas), 'viat '),
    24
)
WHERE instr(lower(notas), 'viat ') > 0;

----------------------------------------
CONSULTAR TIPOS DE VEHICULO
SELECT DISTINCT tipo
FROM vehiculo
ORDER BY tipo;


Actualizar campo matrícula

UPDATE clientes
SET codigo = 'ABC' || codigo;

Si solo quieres hacerlo en los registros que todavía no empiezan por ABC:

UPDATE clientes
SET codigo = 'ABC' || codigo
WHERE codigo NOT LIKE 'ABC%';


Eliminar todos los guiones de un campo
SQLite dispone de la función REPLACE().

UPDATE clientes
SET codigo = REPLACE(codigo, '-', '');


También puedes combinar ambas operaciones
Si quieres quitar los guiones y luego añadir ABC:

UPDATE clientes
SET codigo = 'ABC' || REPLACE(codigo, '-', '');










---------------------------------------

CAMPOS BUSQUEDA VEHICULOS
m_oficial
m_civil
ppm
VIN
Marca
Modelo
Tipo
Población
Departamento






---------------------------------------
Consulta cambiar nombre a un campo
ALTER TABLE nombre_tabla
RENAME COLUMN nombre_antiguo TO nombre_nuevo;

Consulta sql unir campos observaciones e historial en nuevo campo notas.
ALTER TABLE vehiculos ADD COLUMN notas TEXT;
UPDATE vehiculos SET notas = TRIM(COALESCE(observaciones, '') || ' ' || COALESCE(historial, ''));


Consulta eliminar un campo (ejemplo img)
ALTER TABLE nombre_tabla
DROP COLUMN nombre_campo;

ALTER TABLE vehiculos
DROP COLUMN img;
(No se pueden eliminar dos o mas columnas a la vez)

Consulta eliminar guiones o puntos
UPDATE nombre_tabla
SET nombre_campo = REPLACE(nombre_campo, '.', '');

UPDATE nombre_tabla
SET nombre_campo = REPLACE(nombre_campo, '-', '');

UPDATE vehiculos
SET m_oficial = REPLACE(departamento, '.', '');

UPDATE vehiculos
SET departamento = REPLACE(departamento, '.', '');

De este modo solo se modificarán las filas cuyo campo contenga al menos un punto.
UPDATE vehiculos
SET matricula = REPLACE(matricula, '.', '')
WHERE matricula LIKE '%.%';


Actualización multiple

UPDATE vehiculos
SET
    matricula = REPLACE(matricula, '.', ''),
    bastidor = REPLACE(bastidor, '.', ''),
    motor = REPLACE(motor, '.', '');

También puedes aplicar operaciones diferentes a cada campo:

UPDATE vehiculos
SET
    matricula = REPLACE(matricula, '.', ''),
    notas = TRIM(COALESCE(observaciones, '') || ' ' || COALESCE(historial, '')),
    f_alta = '2025-01-01';

Y si solo quieres actualizar determinadas filas, añade una cláusula WHERE:


UPDATE vehiculos
SET
    matricula = REPLACE(matricula, '.', ''),
    bastidor = REPLACE(bastidor, '.', '')
WHERE id = 10;


ACTUALIZACION CON CRITERIOS
Comprobar antes:
SELECT *
FROM vehiculos
WHERE departamento = 'Seg Ciudadana' AND poblacion = 'VELEZ';
Ejecutar update:
UPDATE vehiculos
SET departamento = 'SC'
WHERE departamento = 'Seg Ciudadana'  AND poblacion = 'VELEZ';




CREATE TABLE "historial" (
	"id"	INTEGER,
	"vehiculo_id"	INTEGER,
	"fecha"	TEXT,
	"matricula"	TEXT,
	"situacion"	TEXT,
	"poblacion"	TEXT,
	"unidad"	TEXT,
	"grupo"	TEXT,
	"observaciones"	TEXT,
	PRIMARY KEY("id" AUTOINCREMENT),
	FOREIGN KEY("vehiculo_id") REFERENCES "vehiculos"("id")
)


PRAGMA foreign_keys = OFF;

BEGIN TRANSACTION;

CREATE TABLE revisiones_nueva (
    id INTEGER PRIMARY KEY,
    vehiculo_id INTEGER NOT NULL,
    fecha DATE,
    observaciones TEXT,

    FOREIGN KEY (vehiculo_id)
        REFERENCES vehiculos(id)
        ON UPDATE CASCADE
        ON DELETE CASCADE
);

INSERT INTO revisiones_nueva (id, vehiculo_id, fecha, observaciones)
SELECT id, vehiculo_id, fecha, observaciones
FROM revisiones;

DROP TABLE revisiones;

ALTER TABLE revisiones_nueva RENAME TO revisiones;

COMMIT;

PRAGMA foreign_keys = ON;

—————————————

UPDATE historial
SET vehiculo_id = (
    SELECT id
    FROM vehiculos
    WHERE vehiculos.m_oficial = historial.matricula
);


———————————————

SOBRE LA TABLA HISTÓRIAL

UPDATE historial
SET
    poblacion_id = ‘1',
    unidad = TRIM(REPLACE(unidad, 'MALAGA', ''))
WHERE unidad LIKE '%MALAGA%';


UPDATE unidades
SET
    unidad = TRIM(REPLACE(unidad, 'MALAGA-', ''))
WHERE unidad LIKE '%MALAGA%';












