메인 콘텐츠로 바로가기

데이터베이스 조회

위험

데이터베이스를 직접 수정하면 문제가 발생할 수 있으므로 가능한 한 직접 수정하지 마십시오. 항상 최신 백업을 준비하세요.

docker exec -it immich_postgres psql --dbname=<DB_DATABASE_NAME> --username=<DB_USERNAME> 명령어를 사용하여 컨테이너를 통해 데이터베이스에 연결할 수 있습니다.

(<DB_DATABASE_NAME><DB_USERNAME> 값을 .env 파일에서 가져와서 대체하십시오).

자산

이름

참고

"originalFileName" 칼럼은 업로드 시 파일의 이름과 확장자를 포함합니다.

원래 파일 이름으로 찾기
SELECT * FROM "asset" WHERE "originalFileName" = 'PXL_20230903_232542848.jpg';
SELECT * FROM "asset" WHERE "originalFileName" LIKE 'PXL_%'; -- PXL_로 시작하는 모든 파일
SELECT * FROM "asset" WHERE "originalFileName" LIKE '%_2023_%'; -- 중간에 _2023_를 포함하는 모든 파일
경로로 찾기
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

ID로 찾기
SELECT * FROM "asset" WHERE "id" = '9f94e60f-65b6-47b7-ae44-a4df7b57f0e9';
부분 ID로 찾기
SELECT * FROM "asset" WHERE "id"::text LIKE '%ab431d3a%';

체크섬

참고

특정 파일의 체크섬을 계산하려면 sha1sum <filename> 명령어를 사용할 수 있습니다.

체크섬(SHA-1)으로 찾기
SELECT encode("checksum", 'hex') FROM "asset";
SELECT * FROM "asset" WHERE "checksum" = decode('69de19c87658c4c15d9cacb9967b8e033bf74dd1', 'hex');
SELECT * FROM "asset" WHERE "checksum" = '\x69de19c87658c4c15d9cacb9967b8e033bf74dd1'; -- 다른 표기법
중복 자산 체크섬(SHA-1)으로 찾기 (휴지통 파일 제외)
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";

메타데이터

라이브 사진
SELECT * FROM "asset" WHERE "livePhotoVideoId" IS NOT NULL;
설명으로 검색
SELECT "asset".*, "asset_exif"."description" FROM "asset_exif"
JOIN "asset" ON "asset"."id" = "asset_exif"."assetId"
WHERE TRIM("asset_exif"."description") <> ''; -- 설명이 있는 모든 파일
SELECT "asset".*, "asset_exif"."description" FROM "asset_exif"
JOIN "asset" ON "asset"."id" = "asset_exif"."assetId"
WHERE "asset_exif"."description" ILIKE '%일치할 문자열%'; -- 문자열로 검색
메타데이터 없는 파일
SELECT "asset".* FROM "asset_exif"
LEFT JOIN "asset" ON "asset"."id" = "asset_exif"."assetId"
WHERE "asset_exif"."assetId" IS NULL;
크기 < 100,000 바이트, 작은 순서대로
SELECT * FROM "asset"
JOIN "asset_exif" ON "asset"."id" = "asset_exif"."assetId"
WHERE "asset_exif"."fileSizeInByte" < 100000
ORDER BY "asset_exif"."fileSizeInByte" ASC;

유형

유형별 검색
SELECT * FROM "asset" WHERE "asset"."type" = 'VIDEO';
SELECT * FROM "asset" WHERE "asset"."type" = 'IMAGE';
유형별 개수 계산
SELECT "asset"."type", COUNT(*) FROM "asset" GROUP BY "asset"."type";
유형별 개수 (사용자별)
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";

태그

태그별 개수 계산
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;
태그별 개수 (사용자별)
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;

사용자

모든 사용자 목록
SELECT * FROM "user";
자산 ID로 소유자 정보 가져오기
SELECT "user".* FROM "user" JOIN "asset" ON "user"."id" = "asset"."ownerId" WHERE "asset"."id" = 'fa310b01-2f26-4b7a-9042-d578226e021f';

사람들

얼굴과 연결된 사람 삭제 및 설정 해제
DELETE FROM "person" WHERE "name" = 'PersonNameHere';

시스템

설정

사용자 설정
SELECT "key", "value" FROM "system_metadata" WHERE "key" = 'system-config';

(설정 파일을 사용하지 않을 때만 사용됨)

파일 속성

썸네일 없는 파일
SELECT * FROM "asset" WHERE "asset"."previewPath" IS NULL OR "asset"."thumbnailPath" IS NULL;
파일 이동 실패
SELECT * FROM "move_history";

Postgres 내부

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