Saltar al contenido principal

Consultas de Base de Datos

peligro

Ten en cuenta que manipular la base de datos podría causar desastres. Evita modificar la base de datos directamente siempre que sea posible y asegúrate de tener copias de seguridad actualizadas.

consejo

Ejecuta docker exec -it immich_postgres psql --dbname=<DB_DATABASE_NAME> --username=<DB_USERNAME> para conectarte directamente a la base de datos a través del contenedor.

(Reemplaza <DB_DATABASE_NAME> y <DB_USERNAME> con los valores de tu archivo .env).

Activos

Nombre

nota

La columna "originalFileName" es el nombre del archivo en el momento de la carga, incluida la extensión.

Buscar por nombre original de archivo
SELECT * FROM "asset" WHERE "originalFileName" = 'PXL_20230903_232542848.jpg';
SELECT * FROM "asset" WHERE "originalFileName" LIKE 'PXL_%'; -- todos los archivos que comienzan con PXL_
SELECT * FROM "asset" WHERE "originalFileName" LIKE '%_2023_%'; -- todos los archivos con _2023_ en el medio
Buscar por ruta
SELECT * FROM "asset" WHERE "originalPath" = 'upload/library/admin/2023/2023-09-03/PXL_2023.jpg';
SELECT * FROM "asset" WHERE "originalPath" LIKE 'upload/library/admin/2023/%';

ID

Buscar por ID
SELECT * FROM "asset" WHERE "id" = '9f94e60f-65b6-47b7-ae44-a4df7b57f0e9';
Buscar por ID parcial
SELECT * FROM "asset" WHERE "id"::text LIKE '%ab431d3a%';

Checksum

nota

Puedes calcular el checksum de un archivo específico usando el comando sha1sum <filename>.

Buscar por checksum (SHA-1)
SELECT encode("checksum", 'hex') FROM "asset";
SELECT * FROM "asset" WHERE "checksum" = decode('69de19c87658c4c15d9cacb9967b8e033bf74dd1', 'hex');
SELECT * FROM "asset" WHERE "checksum" = '\x69de19c87658c4c15d9cacb9967b8e033bf74dd1'; -- notación alternativa
Buscar activos duplicados con checksum idénticos (SHA-1) (excluyendo archivos eliminados)
SELECT T1."checksum", array_agg(T2."id") ids FROM "asset" T1
INNER JOIN "asset" T2 ON T1."checksum" = T2."checksum" AND T1."id" != T2."id" AND T2."deletedAt" IS NULL
WHERE T1."deletedAt" IS NULL GROUP BY T1."checksum";

Metadatos

Fotos en vivo
SELECT * FROM "asset" WHERE "livePhotoVideoId" IS NOT NULL;
Por descripción
SELECT "asset".*, "asset_exif"."description" FROM "asset_exif"
JOIN "asset" ON "asset"."id" = "asset_exif"."assetId"
WHERE TRIM("asset_exif"."description") <> ''; -- todos los archivos con una descripción
SELECT "asset".*, "asset_exif"."description" FROM "asset_exif"
JOIN "asset" ON "asset"."id" = "asset_exif"."assetId"
WHERE "asset_exif"."description" ILIKE '%string to match%'; -- búsqueda por cadena
Sin metadatos
SELECT "asset".* FROM "asset_exif"
LEFT JOIN "asset" ON "asset"."id" = "asset_exif"."assetId"
WHERE "asset_exif"."assetId" IS NULL;
tamaño < 100,000 bytes, de menor a mayor
SELECT * FROM "asset"
JOIN "asset_exif" ON "asset"."id" = "asset_exif"."assetId"
WHERE "asset_exif"."fileSizeInByte" < 100000
ORDER BY "asset_exif"."fileSizeInByte" ASC;

Tipo

Por tipo
SELECT * FROM "asset" WHERE "asset"."type" = 'VIDEO';
SELECT * FROM "asset" WHERE "asset"."type" = 'IMAGE';
Conteo por tipo
SELECT "asset"."type", COUNT(*) FROM "asset" GROUP BY "asset"."type";
Conteo por tipo (por usuario)
SELECT "user"."email", "asset"."type", COUNT(*) FROM "asset"
JOIN "user" ON "asset"."ownerId" = "user"."id"
GROUP BY "asset"."type", "user"."email" ORDER BY "user"."email";

Etiquetas

Conteo por etiqueta
SELECT "t"."value" AS "tag_name", COUNT(*) AS "number_assets" FROM "tag" "t"
JOIN "tag_asset" "ta" ON "t"."id" = "ta"."tagsId" JOIN "asset" "a" ON "ta"."assetsId" = "a"."id"
WHERE "a"."visibility" != 'hidden'
GROUP BY "t"."value" ORDER BY "number_assets" DESC;
Conteo por etiqueta (por usuario)
SELECT "t"."value" AS "tag_name", "u"."email" as "user_email", COUNT(*) AS "number_assets" FROM "tag" "t"
JOIN "tag_asset" "ta" ON "t"."id" = "ta"."tagsId" JOIN "asset" "a" ON "ta"."assetsId" = "a"."id" JOIN "user" "u" ON "a"."ownerId" = "u"."id"
WHERE "a"."visibility" != 'hidden'
GROUP BY "t"."value", "u"."email" ORDER BY "number_assets" DESC;

Usuarios

Listar todos los usuarios
SELECT * FROM "user";
Obtener información del propietario mediante el ID de activo
SELECT "user".* FROM "user" JOIN "asset" ON "user"."id" = "asset"."ownerId" WHERE "asset"."id" = 'fa310b01-2f26-4b7a-9042-d578226e021f';

Personas

Eliminar persona y desvincularla de las caras asociadas
DELETE FROM "person" WHERE "name" = 'PersonNameHere';

Sistema

Configuración

Configuraciones personalizadas
SELECT "key", "value" FROM "system_metadata" WHERE "key" = 'system-config';

(Solo se usa cuando no se utiliza el archivo de configuración)

Propiedades del archivo

Sin miniaturas
SELECT * FROM "asset" WHERE "asset"."previewPath" IS NULL OR "asset"."thumbnailPath" IS NULL;
Movimientos de archivos fallidos
SELECT * FROM "move_history";

Interno de Postgres

Cambiar DB_PASSWORD
ALTER USER <DB_USERNAME> WITH ENCRYPTED PASSWORD 'newpasswordhere';