diff --git a/drizzle.config.ts b/drizzle.config.ts index 934ae1b..ac09c57 100755 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -32,7 +32,8 @@ export default defineConfig({ 'trains', 'dataholders', 'stats', - 'ai' + 'ai', + 'movies' ], migrations: { schema: 'drizzle', table: '__drizzle_migrations' }, verbose: true, diff --git a/drizzle/20261026000335_movies/migration.sql b/drizzle/20261026000335_movies/migration.sql new file mode 100644 index 0000000..7c5f5e6 --- /dev/null +++ b/drizzle/20261026000335_movies/migration.sql @@ -0,0 +1,142 @@ +CREATE SCHEMA "movies"; +--> statement-breakpoint +CREATE TABLE "movies"."episodes" ( + "id" serial PRIMARY KEY, + "title_id" integer NOT NULL, + "ep_key" text NOT NULL, + "season" integer, + "episode" integer, + "name" text, + "runtime_min" integer, + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "updated_at" timestamp with time zone DEFAULT now() NOT NULL +); +--> statement-breakpoint +CREATE TABLE "movies"."plays" ( + "id" serial PRIMARY KEY, + "title_id" integer NOT NULL, + "episode_id" integer, + "watched_on" date NOT NULL, + "watched_at" timestamp with time zone, + "duration_min" integer, + "who" text DEFAULT 'stan' NOT NULL, + "platform" text, + "source" text NOT NULL, + "source_key" text NOT NULL, + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "updated_at" timestamp with time zone DEFAULT now() NOT NULL, + CONSTRAINT "plays_who_check" CHECK ("who" IN ('stan','juhee','both')), + CONSTRAINT "plays_platform_check" CHECK ("platform" IS NULL OR "platform" IN ('netflix','plex','cinema','other')) +); +--> statement-breakpoint +CREATE TABLE "movies"."recs" ( + "id" serial PRIMARY KEY, + "tmdb_id" integer NOT NULL, + "type" text NOT NULL, + "title" text NOT NULL, + "for_whom" text NOT NULL, + "reason" text, + "added_at" timestamp with time zone DEFAULT now() NOT NULL, + "poster_path" text, + "year" integer, + "genres" text[] DEFAULT '{}'::text[] NOT NULL, + "metadata_at" timestamp with time zone, + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "updated_at" timestamp with time zone DEFAULT now() NOT NULL, + CONSTRAINT "recs_type_check" CHECK ("type" IN ('movie','show')), + CONSTRAINT "recs_for_check" CHECK ("for_whom" IN ('stan','juhee','both')), + CONSTRAINT "recs_title_check" CHECK (length(btrim("title")) > 0) +); +--> statement-breakpoint +CREATE TABLE "movies"."settings" ( + "key" text PRIMARY KEY, + "value" text NOT NULL, + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "updated_at" timestamp with time zone DEFAULT now() NOT NULL, + CONSTRAINT "settings_key_check" CHECK ("key" IN ('visibility')) +); +--> statement-breakpoint +CREATE TABLE "movies"."titles" ( + "id" serial PRIMARY KEY, + "type" text NOT NULL, + "tmdb_id" integer, + "match_key" text NOT NULL, + "title" text NOT NULL, + "original_title" text, + "year" integer, + "status" text DEFAULT 'watched' NOT NULL, + "rating" real, + "rewatch_count" integer DEFAULT 0 NOT NULL, + "first_watched" date, + "last_watched" date, + "watched_by" text, + "platform" text, + "source" text NOT NULL, + "sources" text[] DEFAULT '{}'::text[] NOT NULL, + "notes" text, + "match_status" text DEFAULT 'pending' NOT NULL, + "poster_path" text, + "backdrop_path" text, + "overview" text, + "genres" text[] DEFAULT '{}'::text[] NOT NULL, + "cast" text[] DEFAULT '{}'::text[] NOT NULL, + "runtime_min" integer, + "total_seasons" integer, + "total_episodes" integer, + "metadata_at" timestamp with time zone, + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "updated_at" timestamp with time zone DEFAULT now() NOT NULL, + CONSTRAINT "titles_type_check" CHECK ("type" IN ('movie','show')), + CONSTRAINT "titles_status_check" CHECK ("status" IN ('watching','watched','watchlist','dropped')), + CONSTRAINT "titles_rating_check" CHECK ("rating" IS NULL OR ("rating" >= 0.5 AND "rating" <= 5 AND "rating" * 2 = round("rating" * 2))), + CONSTRAINT "titles_rewatch_check" CHECK ("rewatch_count" >= 0), + CONSTRAINT "titles_who_check" CHECK ("watched_by" IS NULL OR "watched_by" IN ('stan','juhee','both')), + CONSTRAINT "titles_platform_check" CHECK ("platform" IS NULL OR "platform" IN ('netflix','plex','cinema','other')), + CONSTRAINT "titles_source_check" CHECK ("source" IN ('netflix','plex','letterboxd','manual','ju','site')), + CONSTRAINT "titles_match_check" CHECK ("match_status" IN ('pending','matched','manual','not_found')), + CONSTRAINT "titles_title_check" CHECK (length(btrim("title")) > 0) +); +--> statement-breakpoint +CREATE UNIQUE INDEX "episodes_title_key" ON "movies"."episodes" ("title_id","ep_key");--> statement-breakpoint +CREATE INDEX "episodes_title_idx" ON "movies"."episodes" ("title_id","season","episode");--> statement-breakpoint +CREATE UNIQUE INDEX "plays_source_key" ON "movies"."plays" ("source_key");--> statement-breakpoint +CREATE INDEX "plays_title_idx" ON "movies"."plays" ("title_id");--> statement-breakpoint +CREATE INDEX "plays_watched_idx" ON "movies"."plays" ("watched_on");--> statement-breakpoint +CREATE UNIQUE INDEX "recs_tmdb_key" ON "movies"."recs" ("type","tmdb_id");--> statement-breakpoint +CREATE UNIQUE INDEX "titles_tmdb_key" ON "movies"."titles" ("type","tmdb_id") WHERE "tmdb_id" IS NOT NULL;--> statement-breakpoint +CREATE UNIQUE INDEX "titles_match_key" ON "movies"."titles" ("match_key");--> statement-breakpoint +CREATE INDEX "titles_status_idx" ON "movies"."titles" ("status");--> statement-breakpoint +ALTER TABLE "movies"."episodes" ADD CONSTRAINT "episodes_title_id_titles_id_fkey" FOREIGN KEY ("title_id") REFERENCES "movies"."titles"("id") ON DELETE CASCADE;--> statement-breakpoint +ALTER TABLE "movies"."plays" ADD CONSTRAINT "plays_title_id_titles_id_fkey" FOREIGN KEY ("title_id") REFERENCES "movies"."titles"("id") ON DELETE CASCADE;--> statement-breakpoint +ALTER TABLE "movies"."plays" ADD CONSTRAINT "plays_episode_id_episodes_id_fkey" FOREIGN KEY ("episode_id") REFERENCES "movies"."episodes"("id") ON DELETE CASCADE;--> statement-breakpoint +-- Hand-written below this line (not generated by drizzle-kit). +-- updated_at triggers, same as every other core table. +DO $$ +DECLARE t text; +BEGIN + IF to_regprocedure('meta.touch_updated_at()') IS NOT NULL THEN + FOREACH t IN ARRAY ARRAY['titles','episodes','plays','recs','settings'] LOOP + EXECUTE format('CREATE TRIGGER touch_updated_at BEFORE UPDATE ON movies.%I FOR EACH ROW EXECUTE FUNCTION meta.touch_updated_at()', t); + END LOOP; + END IF; +END $$; +--> statement-breakpoint +-- Public by default; the owner can switch the tracker to private on /trackers/movies. +INSERT INTO movies.settings (key, value) VALUES ('visibility', 'public') ON CONFLICT (key) DO NOTHING; +--> statement-breakpoint +-- Grants: app role read/write only (like ai and tasks; no personal_ro). Prod only, where +-- migrations run as `personal`. +REVOKE ALL ON SCHEMA movies FROM PUBLIC; +--> statement-breakpoint +DO $$ +BEGIN + IF current_user = 'personal' AND EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'personal_app') THEN + GRANT USAGE ON SCHEMA movies TO personal_app; + GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA movies TO personal_app; + GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA movies TO personal_app; + ALTER DEFAULT PRIVILEGES FOR ROLE personal IN SCHEMA movies + GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO personal_app; + ALTER DEFAULT PRIVILEGES FOR ROLE personal IN SCHEMA movies + GRANT USAGE, SELECT ON SEQUENCES TO personal_app; + END IF; +END $$; diff --git a/drizzle/20261026000335_movies/snapshot.json b/drizzle/20261026000335_movies/snapshot.json new file mode 100644 index 0000000..6d67ad9 --- /dev/null +++ b/drizzle/20261026000335_movies/snapshot.json @@ -0,0 +1,38785 @@ +{ + "version": "8", + "dialect": "postgres", + "id": "146db673-05ad-452c-9ea1-afa7d7b9025c", + "prevIds": [ + "6c4aa8c5-cee2-4d68-99ea-0ed9c9c98e54" + ], + "ddl": [ + { + "name": "ai", + "entityType": "schemas" + }, + { + "name": "animaldex", + "entityType": "schemas" + }, + { + "name": "auth", + "entityType": "schemas" + }, + { + "name": "books", + "entityType": "schemas" + }, + { + "name": "cars", + "entityType": "schemas" + }, + { + "name": "cs", + "entityType": "schemas" + }, + { + "name": "dataholders", + "entityType": "schemas" + }, + { + "name": "games", + "entityType": "schemas" + }, + { + "name": "groceries", + "entityType": "schemas" + }, + { + "name": "hardware", + "entityType": "schemas" + }, + { + "name": "health", + "entityType": "schemas" + }, + { + "name": "home", + "entityType": "schemas" + }, + { + "name": "house", + "entityType": "schemas" + }, + { + "name": "meta", + "entityType": "schemas" + }, + { + "name": "money", + "entityType": "schemas" + }, + { + "name": "movies", + "entityType": "schemas" + }, + { + "name": "music", + "entityType": "schemas" + }, + { + "name": "planes", + "entityType": "schemas" + }, + { + "name": "ref", + "entityType": "schemas" + }, + { + "name": "site", + "entityType": "schemas" + }, + { + "name": "stats", + "entityType": "schemas" + }, + { + "name": "tasks", + "entityType": "schemas" + }, + { + "name": "trains", + "entityType": "schemas" + }, + { + "name": "wildlife", + "entityType": "schemas" + }, + { + "values": [ + "draft", + "published" + ], + "name": "blog_article_status", + "entityType": "enums", + "schema": "site" + }, + { + "values": [ + "catchable", + "trade_only", + "transfer_only", + "event_only", + "unknown", + "evolve", + "breed" + ], + "name": "availability", + "entityType": "enums", + "schema": "ref" + }, + { + "values": [ + "book", + "paper", + "article" + ], + "name": "kind", + "entityType": "enums", + "schema": "books" + }, + { + "values": [ + "pending", + "matched", + "low_confidence", + "not_found", + "manual" + ], + "name": "metadata_status", + "entityType": "enums", + "schema": "books" + }, + { + "values": [ + "want_to_read", + "reading", + "finished", + "abandoned" + ], + "name": "reading_status", + "entityType": "enums", + "schema": "books" + }, + { + "isRlsEnabled": false, + "name": "account", + "entityType": "tables", + "schema": "auth" + }, + { + "isRlsEnabled": false, + "name": "session", + "entityType": "tables", + "schema": "auth" + }, + { + "isRlsEnabled": false, + "name": "user", + "entityType": "tables", + "schema": "auth" + }, + { + "isRlsEnabled": false, + "name": "verification", + "entityType": "tables", + "schema": "auth" + }, + { + "isRlsEnabled": false, + "name": "blog_articles", + "entityType": "tables", + "schema": "site" + }, + { + "isRlsEnabled": false, + "name": "tasks", + "entityType": "tables", + "schema": "site" + }, + { + "isRlsEnabled": false, + "name": "task_topics", + "entityType": "tables", + "schema": "site" + }, + { + "isRlsEnabled": false, + "name": "topics", + "entityType": "tables", + "schema": "site" + }, + { + "isRlsEnabled": false, + "name": "catch_em_all_settings", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "pokemon_games", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "pokemon", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "pokemon_encounters", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "pokemon_evolutions", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "pokemon_game_entries", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "pokemon_locations", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "catch_em_all_entries", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "catch_em_all_games", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "tracker_games", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "tracker_items", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "tracker_progress", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "library", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "cs2_share_codes", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "accounts", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "match_players", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "matches", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "seasons", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "snapshots", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "osu_entries", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "pokemon_catches", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "pokemon_dex_numbers", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "pokemon_game_research", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "pokemon_journeys", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "pokemon_learnsets", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "pokemon_milestones", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "pokemon_moves", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "pokemon_research", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "pokemon_seen", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "tracker_challenge_progress", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "tracker_challenges", + "entityType": "tables", + "schema": "ref" + }, + { + "isRlsEnabled": false, + "name": "tracker_ranks", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "tracker_weapon_ranks", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "animals", + "entityType": "tables", + "schema": "animaldex" + }, + { + "isRlsEnabled": false, + "name": "sighting_photos", + "entityType": "tables", + "schema": "animaldex" + }, + { + "isRlsEnabled": false, + "name": "sightings", + "entityType": "tables", + "schema": "animaldex" + }, + { + "isRlsEnabled": false, + "name": "columns", + "entityType": "tables", + "schema": "meta" + }, + { + "isRlsEnabled": false, + "name": "edit_log", + "entityType": "tables", + "schema": "meta" + }, + { + "isRlsEnabled": false, + "name": "tables", + "entityType": "tables", + "schema": "meta" + }, + { + "isRlsEnabled": false, + "name": "accounts", + "entityType": "tables", + "schema": "money" + }, + { + "isRlsEnabled": false, + "name": "bank_sessions", + "entityType": "tables", + "schema": "money" + }, + { + "isRlsEnabled": false, + "name": "forecasts", + "entityType": "tables", + "schema": "money" + }, + { + "isRlsEnabled": false, + "name": "insurances", + "entityType": "tables", + "schema": "money" + }, + { + "isRlsEnabled": false, + "name": "projection_settings", + "entityType": "tables", + "schema": "money" + }, + { + "isRlsEnabled": false, + "name": "recurring", + "entityType": "tables", + "schema": "money" + }, + { + "isRlsEnabled": false, + "name": "transactions", + "entityType": "tables", + "schema": "money" + }, + { + "isRlsEnabled": false, + "name": "utility_readings", + "entityType": "tables", + "schema": "money" + }, + { + "isRlsEnabled": false, + "name": "utility_settings", + "entityType": "tables", + "schema": "money" + }, + { + "isRlsEnabled": false, + "name": "wishlist", + "entityType": "tables", + "schema": "money" + }, + { + "isRlsEnabled": false, + "name": "item_dimensions", + "entityType": "tables", + "schema": "cs" + }, + { + "isRlsEnabled": false, + "name": "items", + "entityType": "tables", + "schema": "cs" + }, + { + "isRlsEnabled": false, + "name": "price_observations", + "entityType": "tables", + "schema": "cs" + }, + { + "isRlsEnabled": false, + "name": "price_streams", + "entityType": "tables", + "schema": "cs" + }, + { + "isRlsEnabled": false, + "name": "alert_rules", + "entityType": "tables", + "schema": "house" + }, + { + "isRlsEnabled": false, + "name": "listings", + "entityType": "tables", + "schema": "house" + }, + { + "isRlsEnabled": false, + "name": "price_history", + "entityType": "tables", + "schema": "house" + }, + { + "isRlsEnabled": false, + "name": "searches", + "entityType": "tables", + "schema": "house" + }, + { + "isRlsEnabled": false, + "name": "worker_runs", + "entityType": "tables", + "schema": "house" + }, + { + "isRlsEnabled": false, + "name": "appointments", + "entityType": "tables", + "schema": "health" + }, + { + "isRlsEnabled": false, + "name": "body_measurements", + "entityType": "tables", + "schema": "health" + }, + { + "isRlsEnabled": false, + "name": "medications", + "entityType": "tables", + "schema": "health" + }, + { + "isRlsEnabled": false, + "name": "nutrition_daily", + "entityType": "tables", + "schema": "health" + }, + { + "isRlsEnabled": false, + "name": "sleep", + "entityType": "tables", + "schema": "health" + }, + { + "isRlsEnabled": false, + "name": "vaccinations", + "entityType": "tables", + "schema": "health" + }, + { + "isRlsEnabled": false, + "name": "workouts", + "entityType": "tables", + "schema": "health" + }, + { + "isRlsEnabled": false, + "name": "deleted_works", + "entityType": "tables", + "schema": "books" + }, + { + "isRlsEnabled": false, + "name": "files", + "entityType": "tables", + "schema": "books" + }, + { + "isRlsEnabled": false, + "name": "notes", + "entityType": "tables", + "schema": "books" + }, + { + "isRlsEnabled": false, + "name": "progress", + "entityType": "tables", + "schema": "books" + }, + { + "isRlsEnabled": false, + "name": "sessions", + "entityType": "tables", + "schema": "books" + }, + { + "isRlsEnabled": false, + "name": "shelf_works", + "entityType": "tables", + "schema": "books" + }, + { + "isRlsEnabled": false, + "name": "shelves", + "entityType": "tables", + "schema": "books" + }, + { + "isRlsEnabled": false, + "name": "works", + "entityType": "tables", + "schema": "books" + }, + { + "isRlsEnabled": false, + "name": "activity", + "entityType": "tables", + "schema": "tasks" + }, + { + "isRlsEnabled": false, + "name": "areas", + "entityType": "tables", + "schema": "tasks" + }, + { + "isRlsEnabled": false, + "name": "goals", + "entityType": "tables", + "schema": "tasks" + }, + { + "isRlsEnabled": false, + "name": "tasks", + "entityType": "tables", + "schema": "tasks" + }, + { + "isRlsEnabled": false, + "name": "categories", + "entityType": "tables", + "schema": "groceries" + }, + { + "isRlsEnabled": false, + "name": "groups", + "entityType": "tables", + "schema": "groceries" + }, + { + "isRlsEnabled": false, + "name": "import_runs", + "entityType": "tables", + "schema": "groceries" + }, + { + "isRlsEnabled": false, + "name": "item_prices", + "entityType": "tables", + "schema": "groceries" + }, + { + "isRlsEnabled": false, + "name": "item_sizes", + "entityType": "tables", + "schema": "groceries" + }, + { + "isRlsEnabled": false, + "name": "items", + "entityType": "tables", + "schema": "groceries" + }, + { + "isRlsEnabled": false, + "name": "manual_prices", + "entityType": "tables", + "schema": "groceries" + }, + { + "isRlsEnabled": false, + "name": "stats_snapshots", + "entityType": "tables", + "schema": "groceries" + }, + { + "isRlsEnabled": false, + "name": "stores", + "entityType": "tables", + "schema": "groceries" + }, + { + "isRlsEnabled": false, + "name": "synonyms", + "entityType": "tables", + "schema": "groceries" + }, + { + "isRlsEnabled": false, + "name": "links", + "entityType": "tables", + "schema": "home" + }, + { + "isRlsEnabled": false, + "name": "snapshots", + "entityType": "tables", + "schema": "home" + }, + { + "isRlsEnabled": false, + "name": "activity", + "entityType": "tables", + "schema": "cars" + }, + { + "isRlsEnabled": false, + "name": "brands", + "entityType": "tables", + "schema": "cars" + }, + { + "isRlsEnabled": false, + "name": "models", + "entityType": "tables", + "schema": "cars" + }, + { + "isRlsEnabled": false, + "name": "photos", + "entityType": "tables", + "schema": "cars" + }, + { + "isRlsEnabled": false, + "name": "seen", + "entityType": "tables", + "schema": "cars" + }, + { + "isRlsEnabled": false, + "name": "variants", + "entityType": "tables", + "schema": "cars" + }, + { + "isRlsEnabled": false, + "name": "activity", + "entityType": "tables", + "schema": "planes" + }, + { + "isRlsEnabled": false, + "name": "makers", + "entityType": "tables", + "schema": "planes" + }, + { + "isRlsEnabled": false, + "name": "photos", + "entityType": "tables", + "schema": "planes" + }, + { + "isRlsEnabled": false, + "name": "seen", + "entityType": "tables", + "schema": "planes" + }, + { + "isRlsEnabled": false, + "name": "types", + "entityType": "tables", + "schema": "planes" + }, + { + "isRlsEnabled": false, + "name": "activity", + "entityType": "tables", + "schema": "wildlife" + }, + { + "isRlsEnabled": false, + "name": "groups", + "entityType": "tables", + "schema": "wildlife" + }, + { + "isRlsEnabled": false, + "name": "photos", + "entityType": "tables", + "schema": "wildlife" + }, + { + "isRlsEnabled": false, + "name": "seen", + "entityType": "tables", + "schema": "wildlife" + }, + { + "isRlsEnabled": false, + "name": "species", + "entityType": "tables", + "schema": "wildlife" + }, + { + "isRlsEnabled": false, + "name": "activity", + "entityType": "tables", + "schema": "trains" + }, + { + "isRlsEnabled": false, + "name": "makers", + "entityType": "tables", + "schema": "trains" + }, + { + "isRlsEnabled": false, + "name": "operators", + "entityType": "tables", + "schema": "trains" + }, + { + "isRlsEnabled": false, + "name": "photos", + "entityType": "tables", + "schema": "trains" + }, + { + "isRlsEnabled": false, + "name": "seen", + "entityType": "tables", + "schema": "trains" + }, + { + "isRlsEnabled": false, + "name": "type_operators", + "entityType": "tables", + "schema": "trains" + }, + { + "isRlsEnabled": false, + "name": "types", + "entityType": "tables", + "schema": "trains" + }, + { + "isRlsEnabled": false, + "name": "albums", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "artist_tag_fetch", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "artist_tags", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "artists", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "import_state", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "now_playing", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "osu_match_cache", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "plays", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "spotify_auth", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "track_artists", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "tracks", + "entityType": "tables", + "schema": "music" + }, + { + "isRlsEnabled": false, + "name": "components", + "entityType": "tables", + "schema": "hardware" + }, + { + "isRlsEnabled": false, + "name": "devices", + "entityType": "tables", + "schema": "hardware" + }, + { + "isRlsEnabled": false, + "name": "sensitivities", + "entityType": "tables", + "schema": "hardware" + }, + { + "isRlsEnabled": false, + "name": "setup_photos", + "entityType": "tables", + "schema": "hardware" + }, + { + "isRlsEnabled": false, + "name": "identity", + "entityType": "tables", + "schema": "dataholders" + }, + { + "isRlsEnabled": false, + "name": "orgs", + "entityType": "tables", + "schema": "dataholders" + }, + { + "isRlsEnabled": false, + "name": "bis_policy_rate", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cbs_code", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cbs_obs", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cbs_table", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cw_cbcs_bop", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cw_cbs_cpi", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cw_cbs_file", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cw_cbs_gdp_industry", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cw_cbs_gov_finance", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cw_cbs_lfs", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cw_cbs_population", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "cw_cbs_tourism", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "eb_item", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "ec_crossborder", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "ec_dayahead_price", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "elec_election", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "elec_result", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "elec_turnout", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "ep_label_agg", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "eurostat_dataset", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "eurostat_obs", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "fetch_run", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "fred_obs", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "gdelt_theme_vol", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "gt_trending", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "hist_event", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "hist_fact", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "hist_holiday", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "hist_office", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "hist_person", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "imf_weo", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "obs", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "op_poll", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "op_wiki_snapshot", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "owid_energy", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "owid_maddison", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "region", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "rf_budget_table", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "series", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "source", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "unesco_site", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "usas_agency_fy", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "ust_debt_daily", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "ust_mts_outlays", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "ust_mts_receipts", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "wb_indicator", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "whr_score", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "wo_compass_override", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "wo_country", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "wo_cultural_map", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "wo_narrative", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "wo_party", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "wo_party_position", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "wo_source", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "wo_value_score", + "entityType": "tables", + "schema": "stats" + }, + { + "isRlsEnabled": false, + "name": "pubg_markers", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "pubg_matches", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "pubg_rooms", + "entityType": "tables", + "schema": "games" + }, + { + "isRlsEnabled": false, + "name": "bot_status", + "entityType": "tables", + "schema": "ai" + }, + { + "isRlsEnabled": false, + "name": "news_items", + "entityType": "tables", + "schema": "ai" + }, + { + "isRlsEnabled": false, + "name": "usage_entries", + "entityType": "tables", + "schema": "ai" + }, + { + "isRlsEnabled": false, + "name": "episodes", + "entityType": "tables", + "schema": "movies" + }, + { + "isRlsEnabled": false, + "name": "plays", + "entityType": "tables", + "schema": "movies" + }, + { + "isRlsEnabled": false, + "name": "recs", + "entityType": "tables", + "schema": "movies" + }, + { + "isRlsEnabled": false, + "name": "settings", + "entityType": "tables", + "schema": "movies" + }, + { + "isRlsEnabled": false, + "name": "titles", + "entityType": "tables", + "schema": "movies" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "account_id", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "issuer", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "provider_id", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "access_token", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "refresh_token", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id_token", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "access_token_expires_at", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "refresh_token_expires_at", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "scope", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "password", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "auth", + "table": "account" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "auth", + "table": "session" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "expires_at", + "entityType": "columns", + "schema": "auth", + "table": "session" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "token", + "entityType": "columns", + "schema": "auth", + "table": "session" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "auth", + "table": "session" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "auth", + "table": "session" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ip_address", + "entityType": "columns", + "schema": "auth", + "table": "session" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_agent", + "entityType": "columns", + "schema": "auth", + "table": "session" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "auth", + "table": "session" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "auth", + "table": "user" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "auth", + "table": "user" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'user'", + "generated": null, + "identity": null, + "name": "role", + "entityType": "columns", + "schema": "auth", + "table": "user" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "email", + "entityType": "columns", + "schema": "auth", + "table": "user" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "email_verified", + "entityType": "columns", + "schema": "auth", + "table": "user" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image", + "entityType": "columns", + "schema": "auth", + "table": "user" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "auth", + "table": "user" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "auth", + "table": "user" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "auth", + "table": "verification" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "identifier", + "entityType": "columns", + "schema": "auth", + "table": "verification" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "auth", + "table": "verification" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "expires_at", + "entityType": "columns", + "schema": "auth", + "table": "verification" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "auth", + "table": "verification" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "auth", + "table": "verification" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "site", + "table": "blog_articles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "site", + "table": "blog_articles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "site", + "table": "blog_articles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "''", + "generated": null, + "identity": null, + "name": "content", + "entityType": "columns", + "schema": "site", + "table": "blog_articles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "tags", + "entityType": "columns", + "schema": "site", + "table": "blog_articles" + }, + { + "type": "blog_article_status", + "typeSchema": "site", + "notNull": true, + "dimensions": 0, + "default": "'draft'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "site", + "table": "blog_articles" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "site", + "table": "blog_articles" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "site", + "table": "blog_articles" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "site", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "site", + "table": "tasks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "current_points", + "entityType": "columns", + "schema": "site", + "table": "tasks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1", + "generated": null, + "identity": null, + "name": "total_points", + "entityType": "columns", + "schema": "site", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "site", + "table": "tasks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "site", + "table": "tasks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "site", + "table": "tasks" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "site", + "table": "task_topics" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "task_id", + "entityType": "columns", + "schema": "site", + "table": "task_topics" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "topic_id", + "entityType": "columns", + "schema": "site", + "table": "task_topics" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "site", + "table": "task_topics" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "site", + "table": "task_topics" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "site", + "table": "topics" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "site", + "table": "topics" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "emoji", + "entityType": "columns", + "schema": "site", + "table": "topics" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "site", + "table": "topics" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "site", + "table": "topics" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_settings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_settings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_settings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_settings" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_games" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_games" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_games" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_games" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1", + "generated": null, + "identity": null, + "name": "generation", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_games" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_games" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "breeding", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_games" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_games" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_games" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "number", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1", + "generated": null, + "identity": null, + "name": "generation", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type1", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type2", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "hp", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "attack", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "defense", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "special_attack", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "special_defense", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "speed", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "evolves_from", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "evolution_chain", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "is_baby", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "is_legendary", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "is_mythical", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pokemon_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "location_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "method", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "min_level", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "max_level", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rarity", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "form", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "conditions", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'pokeapi'", + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "from_pokemon_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "to_pokemon_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "method", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'pokeapi'", + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pokemon_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "type": "availability", + "typeSchema": "ref", + "notNull": true, + "dimensions": 0, + "default": "'catchable'", + "generated": null, + "identity": null, + "name": "availability", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'pokeapi'", + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "region", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_key", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_credit", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'pokeapi'", + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_locations" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_entries" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pokemon_game_entry_id", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_entries" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_entries" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_entries" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_games" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_games" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_games" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_games" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "catch_em_all_games" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "tracker_games" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "ref", + "table": "tracker_games" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "franchise", + "entityType": "columns", + "schema": "ref", + "table": "tracker_games" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "ref", + "table": "tracker_games" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "short_name", + "entityType": "columns", + "schema": "ref", + "table": "tracker_games" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "release_year", + "entityType": "columns", + "schema": "ref", + "table": "tracker_games" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "ref", + "table": "tracker_games" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rules", + "entityType": "columns", + "schema": "ref", + "table": "tracker_games" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ref", + "table": "tracker_games" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ref", + "table": "tracker_games" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "key", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "icon", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "post_launch", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ref", + "table": "tracker_items" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "tracker_progress" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "tracker_progress" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_id", + "entityType": "columns", + "schema": "games", + "table": "tracker_progress" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'done'", + "generated": null, + "identity": null, + "name": "milestone", + "entityType": "columns", + "schema": "games", + "table": "tracker_progress" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "tracker_progress" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "tracker_progress" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "short_name", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'video'", + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'unknown'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "platform", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "tracker_href", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "current_rank", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "peak_rank", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rank_label", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "aliases", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "100", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "active", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "library" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "code", + "entityType": "columns", + "schema": "games", + "table": "cs2_share_codes" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "steam_id", + "entityType": "columns", + "schema": "games", + "table": "cs2_share_codes" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "match_id", + "entityType": "columns", + "schema": "games", + "table": "cs2_share_codes" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "outcome_id", + "entityType": "columns", + "schema": "games", + "table": "cs2_share_codes" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "token", + "entityType": "columns", + "schema": "games", + "table": "cs2_share_codes" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "found_at", + "entityType": "columns", + "schema": "games", + "table": "cs2_share_codes" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "demo_parsed_at", + "entityType": "columns", + "schema": "games", + "table": "cs2_share_codes" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "external_id", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "enabled", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "state", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_polled_at", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_success_at", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_error", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "accounts" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "match_id", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "player_id", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "team", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "is_me", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kills", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "deaths", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "assists", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "damage", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "headshots", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "placement", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "numeric", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rating", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "stats", + "entityType": "columns", + "schema": "games", + "table": "match_players" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "external_id", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "played_at", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "duration_s", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mode", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "map", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "result", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "score_own", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "score_opp", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "placement", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "team_count", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kills", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "deaths", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "assists", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "damage", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "headshots", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "numeric", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rating", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rating_label", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1", + "generated": null, + "identity": null, + "name": "match_count", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "share_code", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "extra", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "raw", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "matches" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "season", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'all'", + "generated": null, + "identity": null, + "name": "board", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rank", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "max_rank", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rank_points", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "max_rank_points", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "matches", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wins", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "losses", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kills", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "deaths", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "raw", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "seasons" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "snapshots" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game", + "entityType": "columns", + "schema": "games", + "table": "snapshots" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "games", + "table": "snapshots" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "games", + "table": "snapshots" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "taken_at", + "entityType": "columns", + "schema": "games", + "table": "snapshots" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "data", + "entityType": "columns", + "schema": "games", + "table": "snapshots" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'osu'", + "generated": null, + "identity": null, + "name": "mode", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "beatmap_url", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "score_url", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'pass'", + "generated": null, + "identity": null, + "name": "goal", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'stamina'", + "generated": null, + "identity": null, + "name": "skill", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bpm", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "duration", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "numeric", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "accuracy", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "combo", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "misses", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "numeric", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pp", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'NM'", + "generated": null, + "identity": null, + "name": "mods", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "numeric(4,2)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1.00", + "generated": null, + "identity": null, + "name": "rate", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "achieved", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "played_on", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "''", + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "osu_entries" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pokemon_id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "''", + "generated": null, + "identity": null, + "name": "nickname", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1", + "generated": null, + "identity": null, + "name": "level", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "moves", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "party_slot", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "shiny", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nature", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ability", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ball", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "location", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'caught'", + "generated": null, + "identity": null, + "name": "obtained", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'story'", + "generated": null, + "identity": null, + "name": "stage", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "''", + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "caught_on", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "pokemon_catches" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_dex_numbers" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pokemon_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_dex_numbers" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_dex_numbers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dex", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_dex_numbers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dex_name", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_dex_numbers" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "number", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_dex_numbers" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_research" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "version_group", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_research" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": null, + "generated": null, + "identity": null, + "name": "regions", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_game_research" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'story'", + "generated": null, + "identity": null, + "name": "stage", + "entityType": "columns", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "location", + "entityType": "columns", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "completed", + "entityType": "columns", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_learnsets" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pokemon_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_learnsets" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "version_group", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_learnsets" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "moves", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_learnsets" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "key", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'story'", + "generated": null, + "identity": null, + "name": "stage", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "done", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "''", + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_moves" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_moves" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_moves" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_moves" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "power", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_moves" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "accuracy", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_moves" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pp", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_moves" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "priority", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_moves" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "target", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_moves" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pokemon_id", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_research" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "facts", + "entityType": "columns", + "schema": "ref", + "table": "pokemon_research" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_seen" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_seen" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_seen" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pokemon_id", + "entityType": "columns", + "schema": "games", + "table": "pokemon_seen" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "pokemon_seen" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "pokemon_seen" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "challenge_id", + "entityType": "columns", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "current", + "entityType": "columns", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "done", + "entityType": "columns", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "key", + "entityType": "columns", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "requirement", + "entityType": "columns", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "reward", + "entityType": "columns", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "icon", + "entityType": "columns", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "target", + "entityType": "columns", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_url", + "entityType": "columns", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "tracker_ranks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "tracker_ranks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game_id", + "entityType": "columns", + "schema": "games", + "table": "tracker_ranks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1", + "generated": null, + "identity": null, + "name": "level", + "entityType": "columns", + "schema": "games", + "table": "tracker_ranks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "prestige", + "entityType": "columns", + "schema": "games", + "table": "tracker_ranks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "tracker_ranks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "tracker_ranks" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_id", + "entityType": "columns", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1", + "generated": null, + "identity": null, + "name": "level", + "entityType": "columns", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "prestige", + "entityType": "columns", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "species", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "breed", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "animal_name", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ai_breed_suggestion", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ai_breed_confidence", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "submitted_at", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "accepted_at", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "denied_at", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "animaldex", + "table": "animals" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "animaldex", + "table": "sighting_photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sighting_id", + "entityType": "columns", + "schema": "animaldex", + "table": "sighting_photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "r2_key", + "entityType": "columns", + "schema": "animaldex", + "table": "sighting_photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "animaldex", + "table": "sighting_photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "animaldex", + "table": "sighting_photos" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "uploaded_at", + "entityType": "columns", + "schema": "animaldex", + "table": "sighting_photos" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "animaldex", + "table": "sighting_photos" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "animaldex", + "table": "sighting_photos" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "animal_id", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "reporter_name", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "seen_at", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lat", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lng", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "submitted_at", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "accepted_at", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "denied_at", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "animaldex", + "table": "sightings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "byDefault", + "name": "columns_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "table_id", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "column_name", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "label", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ui_type", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "options", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "position", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "hidden", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "help_text", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "meta", + "table": "columns" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "always", + "name": "edit_log_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "9223372036854775807", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "meta", + "table": "edit_log" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "at", + "entityType": "columns", + "schema": "meta", + "table": "edit_log" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "meta", + "table": "edit_log" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_email", + "entityType": "columns", + "schema": "meta", + "table": "edit_log" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "schema_name", + "entityType": "columns", + "schema": "meta", + "table": "edit_log" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "table_name", + "entityType": "columns", + "schema": "meta", + "table": "edit_log" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "action", + "entityType": "columns", + "schema": "meta", + "table": "edit_log" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pk", + "entityType": "columns", + "schema": "meta", + "table": "edit_log" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "before", + "entityType": "columns", + "schema": "meta", + "table": "edit_log" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "after", + "entityType": "columns", + "schema": "meta", + "table": "edit_log" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "byDefault", + "name": "tables_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "schema_name", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "table_name", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "display_name", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "icon", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "picture_url", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "editable", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "has_done", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "default_sort", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "archived_at", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "meta", + "table": "tables" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "opening_balance_cents", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'spendable'", + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "include_in_total", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "archived", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "color", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'personal'", + "generated": null, + "identity": null, + "name": "scope", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "owner", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iban", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "external_uid", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'manual'", + "generated": null, + "identity": null, + "name": "provider", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bank_balance_cents", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bank_balance_type", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bank_balance_at", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "money", + "table": "accounts" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'enablebanking'", + "generated": null, + "identity": null, + "name": "provider", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "session_id", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "aspsp_name", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "aspsp_country", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "psu_type", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'authorized'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "valid_until", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'[]'", + "generated": null, + "identity": null, + "name": "accounts", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_synced_at", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_error", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "money", + "table": "bank_sessions" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "money", + "table": "forecasts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "money", + "table": "forecasts" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "money", + "table": "forecasts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "money", + "table": "forecasts" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "amount_cents", + "entityType": "columns", + "schema": "money", + "table": "forecasts" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "account_id", + "entityType": "columns", + "schema": "money", + "table": "forecasts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "money", + "table": "forecasts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "money", + "table": "forecasts" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "money", + "table": "insurances" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "money", + "table": "insurances" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "money", + "table": "insurances" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "provider", + "entityType": "columns", + "schema": "money", + "table": "insurances" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "coverage", + "entityType": "columns", + "schema": "money", + "table": "insurances" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "premium_cents", + "entityType": "columns", + "schema": "money", + "table": "insurances" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'monthly'", + "generated": null, + "identity": null, + "name": "cadence", + "entityType": "columns", + "schema": "money", + "table": "insurances" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "money", + "table": "insurances" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "money", + "table": "insurances" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "investment_account_id", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "100000", + "generated": null, + "identity": null, + "name": "reserve_cents", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "numeric(5,2)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'5.00'", + "generated": null, + "identity": null, + "name": "annual_return_percent", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'excess'", + "generated": null, + "identity": null, + "name": "contribution_mode", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "include_recurring", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "fixed_monthly_cents", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "end_date", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "money", + "table": "projection_settings" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "money", + "table": "recurring" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "money", + "table": "recurring" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "money", + "table": "recurring" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "amount_cents", + "entityType": "columns", + "schema": "money", + "table": "recurring" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "cadence", + "entityType": "columns", + "schema": "money", + "table": "recurring" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "starts_on", + "entityType": "columns", + "schema": "money", + "table": "recurring" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ends_on", + "entityType": "columns", + "schema": "money", + "table": "recurring" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "account_id", + "entityType": "columns", + "schema": "money", + "table": "recurring" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "money", + "table": "recurring" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "money", + "table": "recurring" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "account_id", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "amount_cents", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "external_id", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'manual'", + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "booking_status", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "counterparty", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "raw", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value_date", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "money", + "table": "transactions" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "money", + "table": "utility_readings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "money", + "table": "utility_readings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "money", + "table": "utility_readings" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "money", + "table": "utility_readings" + }, + { + "type": "numeric(12,3)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "reading", + "entityType": "columns", + "schema": "money", + "table": "utility_readings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "money", + "table": "utility_readings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "money", + "table": "utility_readings" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "money", + "table": "utility_settings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "money", + "table": "utility_settings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "money", + "table": "utility_settings" + }, + { + "type": "numeric(12,4)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'0'", + "generated": null, + "identity": null, + "name": "rate_per_unit", + "entityType": "columns", + "schema": "money", + "table": "utility_settings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "monthly_advance_cents", + "entityType": "columns", + "schema": "money", + "table": "utility_settings" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "billing_start", + "entityType": "columns", + "schema": "money", + "table": "utility_settings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "money", + "table": "utility_settings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "money", + "table": "utility_settings" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "money", + "table": "wishlist" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "user_id", + "entityType": "columns", + "schema": "money", + "table": "wishlist" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "money", + "table": "wishlist" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "estimated_cents", + "entityType": "columns", + "schema": "money", + "table": "wishlist" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "3", + "generated": null, + "identity": null, + "name": "priority", + "entityType": "columns", + "schema": "money", + "table": "wishlist" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "money", + "table": "wishlist" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "money", + "table": "wishlist" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "money", + "table": "wishlist" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_id", + "entityType": "columns", + "schema": "cs", + "table": "item_dimensions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "key", + "entityType": "columns", + "schema": "cs", + "table": "item_dimensions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "cs", + "table": "item_dimensions" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "cs", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "market_hash_name", + "entityType": "columns", + "schema": "cs", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "cs", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "icon_url", + "entityType": "columns", + "schema": "cs", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_type", + "entityType": "columns", + "schema": "cs", + "table": "items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "first_seen_at", + "entityType": "columns", + "schema": "cs", + "table": "items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "last_seen_at", + "entityType": "columns", + "schema": "cs", + "table": "items" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "always", + "name": "price_observations_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "9223372036854775807", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "cs", + "table": "price_observations" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_id", + "entityType": "columns", + "schema": "cs", + "table": "price_observations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "cs", + "table": "price_observations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "currency", + "entityType": "columns", + "schema": "cs", + "table": "price_observations" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "observed_at", + "entityType": "columns", + "schema": "cs", + "table": "price_observations" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "price_cents", + "entityType": "columns", + "schema": "cs", + "table": "price_observations" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "volume", + "entityType": "columns", + "schema": "cs", + "table": "price_observations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "cs", + "table": "price_observations" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "imported_at", + "entityType": "columns", + "schema": "cs", + "table": "price_observations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "cs", + "table": "price_streams" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "currency", + "entityType": "columns", + "schema": "cs", + "table": "price_streams" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "cs", + "table": "price_streams" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "enabled", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'rent'", + "generated": null, + "identity": null, + "name": "offer", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "min_price", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "max_price", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "min_area", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "min_bedrooms", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "cities", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "property_types", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "house", + "table": "alert_rules" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_id", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "external_id", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "offer", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "property_type", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "street", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "postal_code", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "city", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "city_slug", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "neighbourhood", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "price_eur", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area_m2", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rooms", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bedrooms", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bathrooms", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "construction_year", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "energy_label", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "interior", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "deposit_eur", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "available_from", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "contract_type", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "agent", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_url", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "features", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lat", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lng", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "offered_at", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "first_seen_at", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'slow'", + "generated": null, + "identity": null, + "name": "first_seen_lane", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "last_seen_at", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "detail_fetched_at", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "removed_at", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "alerted_at", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "address_key", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "duplicate_of", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "total_price_eur", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_score", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_class", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_onv_class", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_level", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_precision", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_buurt_code", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_buurt_name", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_year", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_detail", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_query", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lbm_scored_at", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "contact_status", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "contact_at", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "contact_by", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "contact_note", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "contact_ref", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "viewing_at", + "entityType": "columns", + "schema": "house", + "table": "listings" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "listing_id", + "entityType": "columns", + "schema": "house", + "table": "price_history" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "observed_at", + "entityType": "columns", + "schema": "house", + "table": "price_history" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "price_eur", + "entityType": "columns", + "schema": "house", + "table": "price_history" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "search_url", + "entityType": "columns", + "schema": "house", + "table": "searches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "house", + "table": "searches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lane", + "entityType": "columns", + "schema": "house", + "table": "searches" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "first_synced_at", + "entityType": "columns", + "schema": "house", + "table": "searches" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "last_synced_at", + "entityType": "columns", + "schema": "house", + "table": "searches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "last_found", + "entityType": "columns", + "schema": "house", + "table": "searches" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "always", + "name": "worker_runs_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "9223372036854775807", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "house", + "table": "worker_runs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "house", + "table": "worker_runs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lane", + "entityType": "columns", + "schema": "house", + "table": "worker_runs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "house", + "table": "worker_runs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "house", + "table": "worker_runs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "http_status", + "entityType": "columns", + "schema": "house", + "table": "worker_runs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "found", + "entityType": "columns", + "schema": "house", + "table": "worker_runs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "duration_ms", + "entityType": "columns", + "schema": "house", + "table": "worker_runs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "message", + "entityType": "columns", + "schema": "house", + "table": "worker_runs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "house", + "table": "worker_runs" + }, + { + "type": "uuid", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "gen_random_uuid()", + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "health", + "table": "appointments" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "health", + "table": "appointments" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'appointment'", + "generated": null, + "identity": null, + "name": "type", + "entityType": "columns", + "schema": "health", + "table": "appointments" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "provider", + "entityType": "columns", + "schema": "health", + "table": "appointments" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "health", + "table": "appointments" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "health", + "table": "appointments" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "health", + "table": "appointments" + }, + { + "type": "uuid", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "gen_random_uuid()", + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "numeric(5,2)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "weight_kg", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "numeric(5,1)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "waist_cm", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "numeric(4,1)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "body_fat_pct", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "numeric(5,2)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "muscle_mass_kg", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "numeric(5,2)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "skeletal_muscle_kg", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "numeric(4,2)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bone_mass_kg", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "numeric(4,1)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "visceral_fat", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "numeric(4,1)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "body_water_pct", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "numeric(4,1)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "protein_pct", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bmr_kcal", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "numeric(4,1)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bmi", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "measured_at", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "health", + "table": "body_measurements" + }, + { + "type": "uuid", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "gen_random_uuid()", + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "health", + "table": "medications" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "health", + "table": "medications" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'medication'", + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "health", + "table": "medications" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dose", + "entityType": "columns", + "schema": "health", + "table": "medications" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "frequency", + "entityType": "columns", + "schema": "health", + "table": "medications" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "start_date", + "entityType": "columns", + "schema": "health", + "table": "medications" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "stop_date", + "entityType": "columns", + "schema": "health", + "table": "medications" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "health", + "table": "medications" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "health", + "table": "medications" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "health", + "table": "medications" + }, + { + "type": "uuid", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "gen_random_uuid()", + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "health", + "table": "nutrition_daily" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "health", + "table": "nutrition_daily" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kcal", + "entityType": "columns", + "schema": "health", + "table": "nutrition_daily" + }, + { + "type": "numeric(5,1)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "protein_g", + "entityType": "columns", + "schema": "health", + "table": "nutrition_daily" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "health", + "table": "nutrition_daily" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "health", + "table": "nutrition_daily" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "health", + "table": "nutrition_daily" + }, + { + "type": "uuid", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "gen_random_uuid()", + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "health", + "table": "sleep" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "health", + "table": "sleep" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bedtime", + "entityType": "columns", + "schema": "health", + "table": "sleep" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wake_time", + "entityType": "columns", + "schema": "health", + "table": "sleep" + }, + { + "type": "numeric(4,2)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": { + "as": "round((extract(epoch from (wake_time - bedtime)) / 3600)::numeric, 2)", + "type": "stored" + }, + "identity": null, + "name": "hours", + "entityType": "columns", + "schema": "health", + "table": "sleep" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "health", + "table": "sleep" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "health", + "table": "sleep" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "health", + "table": "sleep" + }, + { + "type": "uuid", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "gen_random_uuid()", + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "vaccine", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "target", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dose_no", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "batch_lot", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "provider", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "health", + "table": "vaccinations" + }, + { + "type": "uuid", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "gen_random_uuid()", + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "uuid", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "session_id", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "exercise", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sets", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "reps", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "numeric(6,2)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "load_kg", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "numeric(3,1)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rpe", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "health", + "table": "workouts" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "authors", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "isbn13", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "annas_md5", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "file_sha256", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "file_paths", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "source_refs", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "merged_into", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "deleted_at", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "quarantined_at", + "entityType": "columns", + "schema": "books", + "table": "deleted_works" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "books", + "table": "files" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "work_id", + "entityType": "columns", + "schema": "books", + "table": "files" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "path", + "entityType": "columns", + "schema": "books", + "table": "files" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "format", + "entityType": "columns", + "schema": "books", + "table": "files" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "size_bytes", + "entityType": "columns", + "schema": "books", + "table": "files" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sha256", + "entityType": "columns", + "schema": "books", + "table": "files" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "md5", + "entityType": "columns", + "schema": "books", + "table": "files" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "books", + "table": "files" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "books", + "table": "files" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "books", + "table": "files" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "books", + "table": "notes" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "work_id", + "entityType": "columns", + "schema": "books", + "table": "notes" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "file_id", + "entityType": "columns", + "schema": "books", + "table": "notes" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "locator", + "entityType": "columns", + "schema": "books", + "table": "notes" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "page", + "entityType": "columns", + "schema": "books", + "table": "notes" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "highlight", + "entityType": "columns", + "schema": "books", + "table": "notes" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "books", + "table": "notes" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "color", + "entityType": "columns", + "schema": "books", + "table": "notes" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "books", + "table": "notes" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "books", + "table": "notes" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "work_id", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "file_id", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "locator", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "page", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "real", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "percent", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "started_at", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "finished_at", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "reading_status", + "typeSchema": "books", + "notNull": true, + "dimensions": 0, + "default": "'want_to_read'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rating", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_read_at", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "books", + "table": "progress" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "work_id", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "file_id", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "started_at", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ended_at", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "start_percent", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "end_percent", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "start_page", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "end_page", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pages_read", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'reader'", + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "books", + "table": "sessions" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "shelf_id", + "entityType": "columns", + "schema": "books", + "table": "shelf_works" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "work_id", + "entityType": "columns", + "schema": "books", + "table": "shelf_works" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "books", + "table": "shelf_works" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "added_at", + "entityType": "columns", + "schema": "books", + "table": "shelf_works" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "books", + "table": "shelves" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "books", + "table": "shelves" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "books", + "table": "shelves" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "books", + "table": "shelves" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "books", + "table": "shelves" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "books", + "table": "shelves" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "kind", + "typeSchema": "books", + "notNull": true, + "dimensions": 0, + "default": "'book'", + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "subtitle", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "authors", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "isbn10", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "isbn13", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "publisher", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "language", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "page_count", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "tags", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "cover_url", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "cover_path", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "openlibrary_work_id", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "openlibrary_edition_id", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "google_books_id", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "annas_md5", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "source_refs", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "metadata_status", + "typeSchema": "books", + "notNull": true, + "dimensions": 0, + "default": "'pending'", + "generated": null, + "identity": null, + "name": "metadata_status", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metadata_source", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metadata_fetched_at", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "site_name", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "published_at", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "archived_at", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "books", + "table": "works" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "tasks", + "table": "activity" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "task_id", + "entityType": "columns", + "schema": "tasks", + "table": "activity" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "goal_id", + "entityType": "columns", + "schema": "tasks", + "table": "activity" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "tasks", + "table": "activity" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "from_status", + "entityType": "columns", + "schema": "tasks", + "table": "activity" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "to_status", + "entityType": "columns", + "schema": "tasks", + "table": "activity" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "tasks", + "table": "activity" + }, + { + "type": "numeric(14,2)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "tasks", + "table": "activity" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "tasks", + "table": "activity" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "tasks", + "table": "areas" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "tasks", + "table": "areas" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "tasks", + "table": "areas" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "tasks", + "table": "areas" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "color", + "entityType": "columns", + "schema": "tasks", + "table": "areas" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "tasks", + "table": "areas" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "archived_at", + "entityType": "columns", + "schema": "tasks", + "table": "areas" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "tasks", + "table": "areas" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "tasks", + "table": "areas" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'active'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area_id", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "target_date", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metric", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metric_unit", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "numeric(14,2)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metric_target", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "numeric(14,2)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metric_current", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "flagged", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "achieved_at", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "tasks", + "table": "goals" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'todo'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "priority", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "flagged", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "due_date", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "time", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "due_time", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "reminder_at", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "recurrence", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area_id", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "goal_id", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "parent_id", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "tags", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "external_id", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "auto_handle", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "start_at", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "time_zone", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "started_at", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "completed_at", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "tasks", + "table": "tasks" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "groceries", + "table": "categories" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "groceries", + "table": "categories" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "groceries", + "table": "categories" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "parent_id", + "entityType": "columns", + "schema": "groceries", + "table": "categories" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "icon", + "entityType": "columns", + "schema": "groceries", + "table": "categories" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "color", + "entityType": "columns", + "schema": "groceries", + "table": "categories" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "groceries", + "table": "categories" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "is_food", + "entityType": "columns", + "schema": "groceries", + "table": "categories" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "groceries", + "table": "categories" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "groceries", + "table": "categories" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "key", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "brand", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category_id", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "family_key", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "favorite", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "manual", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "merged_into_id", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "item_count", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "store_count", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "store_ids", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "min_unit_price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "min_price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "promo_count", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_url", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "is_food", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "''", + "generated": null, + "identity": null, + "name": "search_text", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "groceries", + "table": "groups" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "groceries", + "table": "import_runs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "store_id", + "entityType": "columns", + "schema": "groceries", + "table": "import_runs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "started_at", + "entityType": "columns", + "schema": "groceries", + "table": "import_runs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "finished_at", + "entityType": "columns", + "schema": "groceries", + "table": "import_runs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'running'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "groceries", + "table": "import_runs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "requests", + "entityType": "columns", + "schema": "groceries", + "table": "import_runs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "fetched", + "entityType": "columns", + "schema": "groceries", + "table": "import_runs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "inserted", + "entityType": "columns", + "schema": "groceries", + "table": "import_runs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "price_changes", + "entityType": "columns", + "schema": "groceries", + "table": "import_runs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "error", + "entityType": "columns", + "schema": "groceries", + "table": "import_runs" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "groceries", + "table": "item_prices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_id", + "entityType": "columns", + "schema": "groceries", + "table": "item_prices" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "observed_on", + "entityType": "columns", + "schema": "groceries", + "table": "item_prices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "item_prices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "promo_price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "item_prices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "promo_label", + "entityType": "columns", + "schema": "groceries", + "table": "item_prices" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "groceries", + "table": "item_prices" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "groceries", + "table": "item_sizes" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_id", + "entityType": "columns", + "schema": "groceries", + "table": "item_sizes" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "observed_on", + "entityType": "columns", + "schema": "groceries", + "table": "item_sizes" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit", + "entityType": "columns", + "schema": "groceries", + "table": "item_sizes" + }, + { + "type": "numeric(12,4)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit_amount", + "entityType": "columns", + "schema": "groceries", + "table": "item_sizes" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "size_text", + "entityType": "columns", + "schema": "groceries", + "table": "item_sizes" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "item_sizes" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "groceries", + "table": "item_sizes" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "store_id", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "store_product_id", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "brand", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "size_text", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "numeric(12,4)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit_amount", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit_source", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "promo_price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "promo_label", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit_price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "promo_unit_price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category_path", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category_id", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gtin", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gtin_checked_at", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_url", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "available", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "is_food", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "first_seen_at", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "last_seen_at", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "group_id", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "match_key", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "match_method", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "match_confidence", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "match_locked", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "groceries", + "table": "items" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "store_id", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "group_id", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_id", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "promo", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "size_text", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "numeric(12,4)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit_amount", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit_price_cents", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "observed_on", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo_url", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "groceries", + "table": "manual_prices" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "groceries", + "table": "stats_snapshots" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "computed_on", + "entityType": "columns", + "schema": "groceries", + "table": "stats_snapshots" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "scope", + "entityType": "columns", + "schema": "groceries", + "table": "stats_snapshots" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "computed_at", + "entityType": "columns", + "schema": "groceries", + "table": "stats_snapshots" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "duration_ms", + "entityType": "columns", + "schema": "groceries", + "table": "stats_snapshots" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "data", + "entityType": "columns", + "schema": "groceries", + "table": "stats_snapshots" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "series", + "entityType": "columns", + "schema": "groceries", + "table": "stats_snapshots" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "groceries", + "table": "stores" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "groceries", + "table": "stores" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "groceries", + "table": "stores" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "website", + "entityType": "columns", + "schema": "groceries", + "table": "stores" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "color", + "entityType": "columns", + "schema": "groceries", + "table": "stores" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "groceries", + "table": "stores" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "archived_at", + "entityType": "columns", + "schema": "groceries", + "table": "stores" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "groceries", + "table": "stores" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "groceries", + "table": "stores" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "groceries", + "table": "synonyms" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "term", + "entityType": "columns", + "schema": "groceries", + "table": "synonyms" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "synonym", + "entityType": "columns", + "schema": "groceries", + "table": "synonyms" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "groceries", + "table": "synonyms" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "groceries", + "table": "synonyms" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "home", + "table": "links" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "home", + "table": "links" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "home", + "table": "links" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'links'", + "generated": null, + "identity": null, + "name": "section", + "entityType": "columns", + "schema": "home", + "table": "links" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "home", + "table": "links" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "home", + "table": "links" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "home", + "table": "links" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "key", + "entityType": "columns", + "schema": "home", + "table": "snapshots" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "data", + "entityType": "columns", + "schema": "home", + "table": "snapshots" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "collected_at", + "entityType": "columns", + "schema": "home", + "table": "snapshots" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "model_id", + "entityType": "columns", + "schema": "cars", + "table": "activity" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area", + "entityType": "columns", + "schema": "cars", + "table": "activity" + }, + { + "type": "real", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "score", + "entityType": "columns", + "schema": "cars", + "table": "activity" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "model_count", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "nl_count", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "first_year", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_year", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "sources", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikidata", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikipedia", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_file", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_author", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_license", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "cars", + "table": "brands" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dex", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "brand_id", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "search", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "first_year", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_year", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "bodies", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "size_classes", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "fuels", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "drives", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "transmissions", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "engine_l_min", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "engine_l_max", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "cylinders_min", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "cylinders_max", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "turbo", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "power_kw_min", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "power_kw_max", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "l100_min", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "l100_max", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "co2_min", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "co2_max", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mpg_min", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mpg_max", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "range_km_max", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "seats", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "doors", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mass_kg", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "nl_count", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nl_rank", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nl_first_year", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nl_last_year", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nl_price", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nl_price_latest", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nl_price_latest_year", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'[]'", + "generated": null, + "identity": null, + "name": "nl_years", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'[]'", + "generated": null, + "identity": null, + "name": "nl_names", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "us_years", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "variant_count", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "sources", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikidata", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikipedia", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "photo_count", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photos_checked_at", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "cars", + "table": "models" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "model_id", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "position", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "file", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "caption", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "thumb", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "width", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "height", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "author", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "license", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "license_url", + "entityType": "columns", + "schema": "cars", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "model_id", + "entityType": "columns", + "schema": "cars", + "table": "seen" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "seen_on", + "entityType": "columns", + "schema": "cars", + "table": "seen" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "cars", + "table": "seen" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "cars", + "table": "seen" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "cars", + "table": "seen" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "model_id", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'fueleconomy.gov'", + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_id", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "engine_l", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "cylinders", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "transmission", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "drive", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "fuel", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "size_class", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mpg_city", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mpg_hwy", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mpg_comb", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "co2_gpm", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "range_mi", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ev_motor", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "turbo", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "supercharged", + "entityType": "columns", + "schema": "cars", + "table": "variants" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type_id", + "entityType": "columns", + "schema": "planes", + "table": "activity" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area", + "entityType": "columns", + "schema": "planes", + "table": "activity" + }, + { + "type": "real", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "score", + "entityType": "columns", + "schema": "planes", + "table": "activity" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "full_name", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikidata", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikipedia", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "type_count", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "first_year", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_year", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "built_total", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "sources", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_file", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_author", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_license", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "planes", + "table": "makers" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type_id", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "position", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "file", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "caption", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "thumb", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "width", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "height", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "author", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "license", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "license_url", + "entityType": "columns", + "schema": "planes", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type_id", + "entityType": "columns", + "schema": "planes", + "table": "seen" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "seen_on", + "entityType": "columns", + "schema": "planes", + "table": "seen" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "planes", + "table": "seen" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "planes", + "table": "seen" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "planes", + "table": "seen" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dex", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "maker_id", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "family_id", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "full_name", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "search", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikidata", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikipedia", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "summary", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "role", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "roles", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "role_label", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "first_flight", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "first_flight_year", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "introduced_year", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "retired_year", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "in_service", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "number_built", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "makers", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "engine_type", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "engine_count", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "engines", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "crew", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "passengers", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "length_m", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wingspan_m", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "height_m", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rotor_m", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mtow_kg", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "max_speed_kmh", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "cruise_kmh", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "range_km", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ceiling_m", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wing", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gear", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "icao", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "recognize", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "sources", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "photo_count", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photos_checked_at", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "planes", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "species_id", + "entityType": "columns", + "schema": "wildlife", + "table": "activity" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area", + "entityType": "columns", + "schema": "wildlife", + "table": "activity" + }, + { + "type": "real", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "score", + "entityType": "columns", + "schema": "wildlife", + "table": "activity" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name_nl", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "emoji", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "species_count", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "nl_count", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "wildlife", + "table": "groups" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "species_id", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "position", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo_id", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "width", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "height", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "author", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "license", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "page_url", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "place", + "entityType": "columns", + "schema": "wildlife", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "species_id", + "entityType": "columns", + "schema": "wildlife", + "table": "seen" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "seen_on", + "entityType": "columns", + "schema": "wildlife", + "table": "seen" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "wildlife", + "table": "seen" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "wildlife", + "table": "seen" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "wildlife", + "table": "seen" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dex", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "group_id", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "scientific_name", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name_en", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name_nl", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "search", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "inat_id", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gbif_key", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikidata", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikipedia_en", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikipedia_nl", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "class_name", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "order_name", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "family_name", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iucn", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nl_status", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nl_establishment", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "extinct", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "nl_obs", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "europe_obs", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "world_obs", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gbif_nl", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "scope", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "summary", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "summary_nl", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "facts", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mass_kg", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "length_m", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lifespan_years", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "named_year", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "named_by", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "sources", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "photo_count", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photos_checked_at", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "wildlife", + "table": "species" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type_id", + "entityType": "columns", + "schema": "trains", + "table": "activity" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area", + "entityType": "columns", + "schema": "trains", + "table": "activity" + }, + { + "type": "real", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "score", + "entityType": "columns", + "schema": "trains", + "table": "activity" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "full_name", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikidata", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikipedia", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "type_count", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "first_year", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_year", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "built_total", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "sources", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_file", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_author", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_license", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "trains", + "table": "makers" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "full_name", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikidata", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikipedia", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "type_count", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_file", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_author", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "logo_license", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "trains", + "table": "operators" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type_id", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "position", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "file", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "caption", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "thumb", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "width", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "height", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "author", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "license", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "license_url", + "entityType": "columns", + "schema": "trains", + "table": "photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type_id", + "entityType": "columns", + "schema": "trains", + "table": "seen" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "seen_on", + "entityType": "columns", + "schema": "trains", + "table": "seen" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "trains", + "table": "seen" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "trains", + "table": "seen" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "trains", + "table": "seen" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type_id", + "entityType": "columns", + "schema": "trains", + "table": "type_operators" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "operator_id", + "entityType": "columns", + "schema": "trains", + "table": "type_operators" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "position", + "entityType": "columns", + "schema": "trains", + "table": "type_operators" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dex", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "maker_id", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "family_id", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "full_name", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nl_name", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "search", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikidata", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikipedia", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "summary", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category_label", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "traction", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "countries", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "makers", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "operators", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "first_built", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_built", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "introduced_year", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "retired_year", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "in_service", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "number_built", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "max_speed_kmh", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "power_kw", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gauge", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gauge_mm", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "electric_system", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wheels", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "length_m", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "weight_t", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "capacity", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "formation", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "designer", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "nicknames", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "sources", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "photo_count", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photos_checked_at", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "trains", + "table": "types" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "music", + "table": "albums" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "spotify_id", + "entityType": "columns", + "schema": "music", + "table": "albums" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "music", + "table": "albums" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "artist_id", + "entityType": "columns", + "schema": "music", + "table": "albums" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_url", + "entityType": "columns", + "schema": "music", + "table": "albums" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_url_small", + "entityType": "columns", + "schema": "music", + "table": "albums" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "release_date", + "entityType": "columns", + "schema": "music", + "table": "albums" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "music", + "table": "albums" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "artist_id", + "entityType": "columns", + "schema": "music", + "table": "artist_tag_fetch" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "music", + "table": "artist_tag_fetch" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "fetched_at", + "entityType": "columns", + "schema": "music", + "table": "artist_tag_fetch" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "artist_id", + "entityType": "columns", + "schema": "music", + "table": "artist_tags" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "tag", + "entityType": "columns", + "schema": "music", + "table": "artist_tags" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "weight", + "entityType": "columns", + "schema": "music", + "table": "artist_tags" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "music", + "table": "artists" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "spotify_id", + "entityType": "columns", + "schema": "music", + "table": "artists" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "music", + "table": "artists" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_url", + "entityType": "columns", + "schema": "music", + "table": "artists" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "music", + "table": "artists" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "key", + "entityType": "columns", + "schema": "music", + "table": "import_state" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "data", + "entityType": "columns", + "schema": "music", + "table": "import_state" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "music", + "table": "import_state" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1", + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "music", + "table": "now_playing" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "track_id", + "entityType": "columns", + "schema": "music", + "table": "now_playing" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "is_playing", + "entityType": "columns", + "schema": "music", + "table": "now_playing" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "progress_ms", + "entityType": "columns", + "schema": "music", + "table": "now_playing" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "device_name", + "entityType": "columns", + "schema": "music", + "table": "now_playing" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "device_type", + "entityType": "columns", + "schema": "music", + "table": "now_playing" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "context_uri", + "entityType": "columns", + "schema": "music", + "table": "now_playing" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "music", + "table": "now_playing" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "key", + "entityType": "columns", + "schema": "music", + "table": "osu_match_cache" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "result", + "entityType": "columns", + "schema": "music", + "table": "osu_match_cache" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "searched_at", + "entityType": "columns", + "schema": "music", + "table": "osu_match_cache" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "music", + "table": "plays" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "track_id", + "entityType": "columns", + "schema": "music", + "table": "plays" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "played_at", + "entityType": "columns", + "schema": "music", + "table": "plays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'spotify'", + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "music", + "table": "plays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'api'", + "generated": null, + "identity": null, + "name": "origin", + "entityType": "columns", + "schema": "music", + "table": "plays" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ms_played", + "entityType": "columns", + "schema": "music", + "table": "plays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "context_type", + "entityType": "columns", + "schema": "music", + "table": "plays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "context_uri", + "entityType": "columns", + "schema": "music", + "table": "plays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "platform", + "entityType": "columns", + "schema": "music", + "table": "plays" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "music", + "table": "plays" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1", + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "spotify_user_id", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "display_name", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "refresh_token", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "access_token", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "access_expires_at", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "scope", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "recent_cursor", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "needs_reauth", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lease_until", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lease_holder", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_poll_at", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_error", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "connected_at", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "music", + "table": "spotify_auth" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "track_id", + "entityType": "columns", + "schema": "music", + "table": "track_artists" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "artist_id", + "entityType": "columns", + "schema": "music", + "table": "track_artists" + }, + { + "type": "smallint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "position", + "entityType": "columns", + "schema": "music", + "table": "track_artists" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "music", + "table": "tracks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "spotify_id", + "entityType": "columns", + "schema": "music", + "table": "tracks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "music", + "table": "tracks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "album_id", + "entityType": "columns", + "schema": "music", + "table": "tracks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "artist_id", + "entityType": "columns", + "schema": "music", + "table": "tracks" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "duration_ms", + "entityType": "columns", + "schema": "music", + "table": "tracks" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "explicit", + "entityType": "columns", + "schema": "music", + "table": "tracks" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "match_key", + "entityType": "columns", + "schema": "music", + "table": "tracks" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "music", + "table": "tracks" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "always", + "name": "components_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "9223372036854775807", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "device_id", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "brand", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "model", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "1", + "generated": null, + "identity": null, + "name": "quantity", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "specs", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit_price_cents", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "total_price_cents", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "shop", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "order_number", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "order_date", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "warranty_until", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "invoice_number", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'in_use'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "verified", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dpi", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "measured_dpi", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_url", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "section", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slot", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "installed_at", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "removed_at", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "replaces_id", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "usage", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "image_urls", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "image_sources", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "hidden", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "hardware", + "table": "components" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "always", + "name": "devices_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "9223372036854775807", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "label", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "hostnames", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'active'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "brand", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "model", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "specs", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "price_cents", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "monthly_cents", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "budget_cents", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "shop", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "purchase_date", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_url", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "100", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "installed_at", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "removed_at", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "image_urls", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "image_sources", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "hidden", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "hardware", + "table": "devices" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "always", + "name": "sensitivities_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "9223372036854775807", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "game", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "numeric(7,2)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "cm_per_360", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "numeric(10,6)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "yaw", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "numeric(10,4)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "in_game_sens", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mouse_id", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "fov", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "100", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "hardware", + "table": "sensitivities" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "always", + "name": "setup_photos_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "9223372036854775807", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "hardware", + "table": "setup_photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "hardware", + "table": "setup_photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "caption", + "entityType": "columns", + "schema": "hardware", + "table": "setup_photos" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "taken_at", + "entityType": "columns", + "schema": "hardware", + "table": "setup_photos" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "100", + "generated": null, + "identity": null, + "name": "sort_order", + "entityType": "columns", + "schema": "hardware", + "table": "setup_photos" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "hardware", + "table": "setup_photos" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "dataholders", + "table": "identity" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "dataholders", + "table": "identity" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "since", + "entityType": "columns", + "schema": "dataholders", + "table": "identity" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "dataholders", + "table": "identity" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "dataholders", + "table": "identity" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "always", + "name": "orgs_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": 1, + "cycle": false + }, + "name": "id", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'Other'", + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "login", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "domains", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "import_key", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "holds_address", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "holds_email", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "holds_phone", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "holds_iban", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "holds_bsn", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "holds_card", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "holds_dob", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "holds_id_doc", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "data_held", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "address_on_file", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'unknown'", + "generated": null, + "identity": null, + "name": "address_status", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "follows_brp", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "email_on_file", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "phone_on_file", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'update'", + "generated": null, + "identity": null, + "name": "action", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'should'", + "generated": null, + "identity": null, + "name": "priority", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "how_to_change", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "link", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "evidence", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "address_updated_on", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "email_updated_on", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "phone_updated_on", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iban_updated_on", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_checked", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "archived", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "edited_at", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "dataholders", + "table": "orgs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ref_area", + "entityType": "columns", + "schema": "stats", + "table": "bis_policy_rate" + }, + { + "type": "char(1)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "freq", + "entityType": "columns", + "schema": "stats", + "table": "bis_policy_rate" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "period", + "entityType": "columns", + "schema": "stats", + "table": "bis_policy_rate" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rate", + "entityType": "columns", + "schema": "stats", + "table": "bis_policy_rate" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "table_id", + "entityType": "columns", + "schema": "stats", + "table": "cbs_code" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dimension", + "entityType": "columns", + "schema": "stats", + "table": "cbs_code" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "code", + "entityType": "columns", + "schema": "stats", + "table": "cbs_code" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "stats", + "table": "cbs_code" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit", + "entityType": "columns", + "schema": "stats", + "table": "cbs_code" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "decimals", + "entityType": "columns", + "schema": "stats", + "table": "cbs_code" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "group_id", + "entityType": "columns", + "schema": "stats", + "table": "cbs_code" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sort_index", + "entityType": "columns", + "schema": "stats", + "table": "cbs_code" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "table_id", + "entityType": "columns", + "schema": "stats", + "table": "cbs_obs" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "obs_id", + "entityType": "columns", + "schema": "stats", + "table": "cbs_obs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "measure", + "entityType": "columns", + "schema": "stats", + "table": "cbs_obs" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dims", + "entityType": "columns", + "schema": "stats", + "table": "cbs_obs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "period", + "entityType": "columns", + "schema": "stats", + "table": "cbs_obs" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "cbs_obs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value_attribute", + "entityType": "columns", + "schema": "stats", + "table": "cbs_obs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "table_id", + "entityType": "columns", + "schema": "stats", + "table": "cbs_table" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "stats", + "table": "cbs_table" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "modified", + "entityType": "columns", + "schema": "stats", + "table": "cbs_table" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "stats", + "table": "cbs_table" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "filter", + "entityType": "columns", + "schema": "stats", + "table": "cbs_table" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "obs_count", + "entityType": "columns", + "schema": "stats", + "table": "cbs_table" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "fetched_at", + "entityType": "columns", + "schema": "stats", + "table": "cbs_table" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "period", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbcs_bop" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbcs_bop" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mln_ang", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbcs_bop" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "uploaded_at", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbcs_bop" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "period", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_cpi" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "cpi_index", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_cpi" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "infl_mom", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_cpi" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "infl_yoy", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_cpi" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "infl_12m_avg", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_cpi" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "base", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_cpi" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_file" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "topic", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_file" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "filename", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_file" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sha256", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_file" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "fetched_at", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_file" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_gdp_industry" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "isic", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_gdp_industry" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "label", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_gdp_industry" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mln_ang", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_gdp_industry" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "provisional", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_gdp_industry" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_gov_finance" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_code", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_gov_finance" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "label", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_gov_finance" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "mln_ang", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_gov_finance" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "true", + "generated": null, + "identity": null, + "name": "provisional", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_gov_finance" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_lfs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sex", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_lfs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "age_group", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_lfs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "measure", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_lfs" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_lfs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_population" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sex", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_population" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "age_group", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_population" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_population" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_population" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "period", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_tourism" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "measure", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_tourism" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "market", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_tourism" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "cw_cbs_tourism" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wave", + "entityType": "columns", + "schema": "stats", + "table": "eb_item" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "fieldwork_end", + "entityType": "columns", + "schema": "stats", + "table": "eb_item" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "topic", + "entityType": "columns", + "schema": "stats", + "table": "eb_item" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "qcode", + "entityType": "columns", + "schema": "stats", + "table": "eb_item" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item", + "entityType": "columns", + "schema": "stats", + "table": "eb_item" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "stats", + "table": "eb_item" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "share", + "entityType": "columns", + "schema": "stats", + "table": "eb_item" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "stats", + "table": "ec_crossborder" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "neighbour", + "entityType": "columns", + "schema": "stats", + "table": "ec_crossborder" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ts", + "entityType": "columns", + "schema": "stats", + "table": "ec_crossborder" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gw", + "entityType": "columns", + "schema": "stats", + "table": "ec_crossborder" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "bzn", + "entityType": "columns", + "schema": "stats", + "table": "ec_dayahead_price" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ts", + "entityType": "columns", + "schema": "stats", + "table": "ec_dayahead_price" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "eur_mwh", + "entityType": "columns", + "schema": "stats", + "table": "ec_dayahead_price" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "election_id", + "entityType": "columns", + "schema": "stats", + "table": "elec_election" + }, + { + "type": "char(3)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "stats", + "table": "elec_election" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "stats", + "table": "elec_election" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "stats", + "table": "elec_election" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "stats", + "table": "elec_election" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_id", + "entityType": "columns", + "schema": "stats", + "table": "elec_election" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "total_seats", + "entityType": "columns", + "schema": "stats", + "table": "elec_election" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "election_id", + "entityType": "columns", + "schema": "stats", + "table": "elec_result" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "level", + "entityType": "columns", + "schema": "stats", + "table": "elec_result" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area_code", + "entityType": "columns", + "schema": "stats", + "table": "elec_result" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area_name", + "entityType": "columns", + "schema": "stats", + "table": "elec_result" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "party", + "entityType": "columns", + "schema": "stats", + "table": "elec_result" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "votes", + "entityType": "columns", + "schema": "stats", + "table": "elec_result" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "seats", + "entityType": "columns", + "schema": "stats", + "table": "elec_result" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "election_id", + "entityType": "columns", + "schema": "stats", + "table": "elec_turnout" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "level", + "entityType": "columns", + "schema": "stats", + "table": "elec_turnout" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area_code", + "entityType": "columns", + "schema": "stats", + "table": "elec_turnout" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area_name", + "entityType": "columns", + "schema": "stats", + "table": "elec_turnout" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "electorate", + "entityType": "columns", + "schema": "stats", + "table": "elec_turnout" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ballots", + "entityType": "columns", + "schema": "stats", + "table": "elec_turnout" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "valid", + "entityType": "columns", + "schema": "stats", + "table": "elec_turnout" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "blank", + "entityType": "columns", + "schema": "stats", + "table": "elec_turnout" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "invalid", + "entityType": "columns", + "schema": "stats", + "table": "elec_turnout" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "snapshot", + "entityType": "columns", + "schema": "stats", + "table": "ep_label_agg" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "area", + "entityType": "columns", + "schema": "stats", + "table": "ep_label_agg" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "label", + "entityType": "columns", + "schema": "stats", + "table": "ep_label_agg" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "homes", + "entityType": "columns", + "schema": "stats", + "table": "ep_label_agg" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "code", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_dataset" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "label", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_dataset" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "updated", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_dataset" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "query", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_dataset" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "dims", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_dataset" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "obs_count", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_dataset" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "fetched_at", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_dataset" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dataset", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_obs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "key", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_obs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "geo", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_obs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "period", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_obs" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_obs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "stats", + "table": "eurostat_obs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": { + "type": "always", + "name": "fetch_run_run_id_seq", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": 1, + "cycle": false + }, + "name": "run_id", + "entityType": "columns", + "schema": "stats", + "table": "fetch_run" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_id", + "entityType": "columns", + "schema": "stats", + "table": "fetch_run" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'refresh'", + "generated": null, + "identity": null, + "name": "job", + "entityType": "columns", + "schema": "stats", + "table": "fetch_run" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "started_at", + "entityType": "columns", + "schema": "stats", + "table": "fetch_run" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "finished_at", + "entityType": "columns", + "schema": "stats", + "table": "fetch_run" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rows", + "entityType": "columns", + "schema": "stats", + "table": "fetch_run" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ok", + "entityType": "columns", + "schema": "stats", + "table": "fetch_run" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "error", + "entityType": "columns", + "schema": "stats", + "table": "fetch_run" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "series_id", + "entityType": "columns", + "schema": "stats", + "table": "fred_obs" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "period", + "entityType": "columns", + "schema": "stats", + "table": "fred_obs" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "fred_obs" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "stats", + "table": "gdelt_theme_vol" + }, + { + "type": "char(3)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "stats", + "table": "gdelt_theme_vol" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "theme", + "entityType": "columns", + "schema": "stats", + "table": "gdelt_theme_vol" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "vol_pct", + "entityType": "columns", + "schema": "stats", + "table": "gdelt_theme_vol" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "geo", + "entityType": "columns", + "schema": "stats", + "table": "gt_trending" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "stats", + "table": "gt_trending" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rank", + "entityType": "columns", + "schema": "stats", + "table": "gt_trending" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "query", + "entityType": "columns", + "schema": "stats", + "table": "gt_trending" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "approx_traffic", + "entityType": "columns", + "schema": "stats", + "table": "gt_trending" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pub_date", + "entityType": "columns", + "schema": "stats", + "table": "gt_trending" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "news", + "entityType": "columns", + "schema": "stats", + "table": "gt_trending" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "place", + "entityType": "columns", + "schema": "stats", + "table": "hist_event" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "stats", + "table": "hist_event" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "hist_event" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year_end", + "entityType": "columns", + "schema": "stats", + "table": "hist_event" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date_label", + "entityType": "columns", + "schema": "stats", + "table": "hist_event" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "stats", + "table": "hist_event" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "summary", + "entityType": "columns", + "schema": "stats", + "table": "hist_event" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "theme", + "entityType": "columns", + "schema": "stats", + "table": "hist_event" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_url", + "entityType": "columns", + "schema": "stats", + "table": "hist_event" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "place", + "entityType": "columns", + "schema": "stats", + "table": "hist_fact" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "slug", + "entityType": "columns", + "schema": "stats", + "table": "hist_fact" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "topic", + "entityType": "columns", + "schema": "stats", + "table": "hist_fact" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "stats", + "table": "hist_fact" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "body", + "entityType": "columns", + "schema": "stats", + "table": "hist_fact" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_url", + "entityType": "columns", + "schema": "stats", + "table": "hist_fact" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sort", + "entityType": "columns", + "schema": "stats", + "table": "hist_fact" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "place", + "entityType": "columns", + "schema": "stats", + "table": "hist_holiday" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "stats", + "table": "hist_holiday" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "stats", + "table": "hist_holiday" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "local_name", + "entityType": "columns", + "schema": "stats", + "table": "hist_holiday" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "global", + "entityType": "columns", + "schema": "stats", + "table": "hist_holiday" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "types", + "entityType": "columns", + "schema": "stats", + "table": "hist_holiday" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "place", + "entityType": "columns", + "schema": "stats", + "table": "hist_office" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "stats", + "table": "hist_office" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "office_qid", + "entityType": "columns", + "schema": "stats", + "table": "hist_office" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "office_label", + "entityType": "columns", + "schema": "stats", + "table": "hist_office" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "person_qid", + "entityType": "columns", + "schema": "stats", + "table": "hist_office" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "person_label", + "entityType": "columns", + "schema": "stats", + "table": "hist_office" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "party", + "entityType": "columns", + "schema": "stats", + "table": "hist_office" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "start_date", + "entityType": "columns", + "schema": "stats", + "table": "hist_office" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "end_date", + "entityType": "columns", + "schema": "stats", + "table": "hist_office" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "place", + "entityType": "columns", + "schema": "stats", + "table": "hist_person" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "person_qid", + "entityType": "columns", + "schema": "stats", + "table": "hist_person" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "label", + "entityType": "columns", + "schema": "stats", + "table": "hist_person" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "stats", + "table": "hist_person" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "birth_year", + "entityType": "columns", + "schema": "stats", + "table": "hist_person" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "death_year", + "entityType": "columns", + "schema": "stats", + "table": "hist_person" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sitelinks", + "entityType": "columns", + "schema": "stats", + "table": "hist_person" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "stats", + "table": "hist_person" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rank", + "entityType": "columns", + "schema": "stats", + "table": "hist_person" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "vintage", + "entityType": "columns", + "schema": "stats", + "table": "imf_weo" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "indicator", + "entityType": "columns", + "schema": "stats", + "table": "imf_weo" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country_iso3", + "entityType": "columns", + "schema": "stats", + "table": "imf_weo" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "imf_weo" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "imf_weo" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "is_forecast", + "entityType": "columns", + "schema": "stats", + "table": "imf_weo" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "series_id", + "entityType": "columns", + "schema": "stats", + "table": "obs" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "period", + "entityType": "columns", + "schema": "stats", + "table": "obs" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "obs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "stats", + "table": "obs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "fetched_at", + "entityType": "columns", + "schema": "stats", + "table": "obs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "series", + "entityType": "columns", + "schema": "stats", + "table": "op_poll" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "poll_key", + "entityType": "columns", + "schema": "stats", + "table": "op_poll" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "fieldwork_end", + "entityType": "columns", + "schema": "stats", + "table": "op_poll" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pollster", + "entityType": "columns", + "schema": "stats", + "table": "op_poll" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sample", + "entityType": "columns", + "schema": "stats", + "table": "op_poll" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "option", + "entityType": "columns", + "schema": "stats", + "table": "op_poll" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "op_poll" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "seen_at", + "entityType": "columns", + "schema": "stats", + "table": "op_poll" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "page", + "entityType": "columns", + "schema": "stats", + "table": "op_wiki_snapshot" + }, + { + "type": "bigint", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "revid", + "entityType": "columns", + "schema": "stats", + "table": "op_wiki_snapshot" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "fetched_at", + "entityType": "columns", + "schema": "stats", + "table": "op_wiki_snapshot" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wikitext", + "entityType": "columns", + "schema": "stats", + "table": "op_wiki_snapshot" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "stats", + "table": "owid_energy" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iso3", + "entityType": "columns", + "schema": "stats", + "table": "owid_energy" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "owid_energy" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "values", + "entityType": "columns", + "schema": "stats", + "table": "owid_energy" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "entity", + "entityType": "columns", + "schema": "stats", + "table": "owid_maddison" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iso3", + "entityType": "columns", + "schema": "stats", + "table": "owid_maddison" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "owid_maddison" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gdp_pc", + "entityType": "columns", + "schema": "stats", + "table": "owid_maddison" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "region_code", + "entityType": "columns", + "schema": "stats", + "table": "region" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "stats", + "table": "region" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "stats", + "table": "region" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "parent", + "entityType": "columns", + "schema": "stats", + "table": "region" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "phase", + "entityType": "columns", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "row_key", + "entityType": "columns", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "type": "char(1)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "vuo", + "entityType": "columns", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "chapter", + "entityType": "columns", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "chapter_name", + "entityType": "columns", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "article", + "entityType": "columns", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "article_name", + "entityType": "columns", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "detail", + "entityType": "columns", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "amount_eur_k", + "entityType": "columns", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "series_id", + "entityType": "columns", + "schema": "stats", + "table": "series" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_id", + "entityType": "columns", + "schema": "stats", + "table": "series" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_code", + "entityType": "columns", + "schema": "stats", + "table": "series" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "stats", + "table": "series" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit", + "entityType": "columns", + "schema": "stats", + "table": "series" + }, + { + "type": "char(1)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "freq", + "entityType": "columns", + "schema": "stats", + "table": "series" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "region_code", + "entityType": "columns", + "schema": "stats", + "table": "series" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "theme", + "entityType": "columns", + "schema": "stats", + "table": "series" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "meta", + "entityType": "columns", + "schema": "stats", + "table": "series" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_id", + "entityType": "columns", + "schema": "stats", + "table": "source" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "stats", + "table": "source" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "base_url", + "entityType": "columns", + "schema": "stats", + "table": "source" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "licence", + "entityType": "columns", + "schema": "stats", + "table": "source" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "false", + "generated": null, + "identity": null, + "name": "key_required", + "entityType": "columns", + "schema": "stats", + "table": "source" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "attribution", + "entityType": "columns", + "schema": "stats", + "table": "source" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id_no", + "entityType": "columns", + "schema": "stats", + "table": "unesco_site" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "stats", + "table": "unesco_site" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "places", + "entityType": "columns", + "schema": "stats", + "table": "unesco_site" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "category", + "entityType": "columns", + "schema": "stats", + "table": "unesco_site" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year_inscribed", + "entityType": "columns", + "schema": "stats", + "table": "unesco_site" + }, + { + "type": "boolean", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "danger", + "entityType": "columns", + "schema": "stats", + "table": "unesco_site" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "stats", + "table": "unesco_site" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lat", + "entityType": "columns", + "schema": "stats", + "table": "unesco_site" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lon", + "entityType": "columns", + "schema": "stats", + "table": "unesco_site" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "image_url", + "entityType": "columns", + "schema": "stats", + "table": "unesco_site" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "toptier_code", + "entityType": "columns", + "schema": "stats", + "table": "usas_agency_fy" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "fiscal_year", + "entityType": "columns", + "schema": "stats", + "table": "usas_agency_fy" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "agency_name", + "entityType": "columns", + "schema": "stats", + "table": "usas_agency_fy" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "abbreviation", + "entityType": "columns", + "schema": "stats", + "table": "usas_agency_fy" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "budgetary_resources", + "entityType": "columns", + "schema": "stats", + "table": "usas_agency_fy" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "obligated", + "entityType": "columns", + "schema": "stats", + "table": "usas_agency_fy" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "outlayed", + "entityType": "columns", + "schema": "stats", + "table": "usas_agency_fy" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "record_date", + "entityType": "columns", + "schema": "stats", + "table": "ust_debt_daily" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "debt_held_public", + "entityType": "columns", + "schema": "stats", + "table": "ust_debt_daily" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "intragov_holdings", + "entityType": "columns", + "schema": "stats", + "table": "ust_debt_daily" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "total_debt", + "entityType": "columns", + "schema": "stats", + "table": "ust_debt_daily" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "record_date", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_outlays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "classification_id", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_outlays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "parent_id", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_outlays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_outlays" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "level", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_outlays" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "print_order", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_outlays" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "net_month", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_outlays" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "net_fytd", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_outlays" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gross_month", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_outlays" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "record_date", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_receipts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "classification_id", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_receipts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "parent_id", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_receipts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "description", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_receipts" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "level", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_receipts" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "print_order", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_receipts" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "net_month", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_receipts" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "net_fytd", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_receipts" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gross_month", + "entityType": "columns", + "schema": "stats", + "table": "ust_mts_receipts" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "indicator_id", + "entityType": "columns", + "schema": "stats", + "table": "wb_indicator" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country_iso3", + "entityType": "columns", + "schema": "stats", + "table": "wb_indicator" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "wb_indicator" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "wb_indicator" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "country", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "char(3)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iso3", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rank", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ladder", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lower", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "upper", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "gdp", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "social", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "health", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "freedom", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "generosity", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "corruption", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dystopia", + "entityType": "columns", + "schema": "stats", + "table": "whr_score" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "party_id", + "entityType": "columns", + "schema": "stats", + "table": "wo_compass_override" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "x", + "entityType": "columns", + "schema": "stats", + "table": "wo_compass_override" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "y", + "entityType": "columns", + "schema": "stats", + "table": "wo_compass_override" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "stats", + "table": "wo_compass_override" + }, + { + "type": "char(3)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iso3", + "entityType": "columns", + "schema": "stats", + "table": "wo_country" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "stats", + "table": "wo_country" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iso_num", + "entityType": "columns", + "schema": "stats", + "table": "wo_country" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "stats", + "table": "wo_country" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "region", + "entityType": "columns", + "schema": "stats", + "table": "wo_country" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "liberal_meaning", + "entityType": "columns", + "schema": "stats", + "table": "wo_country" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "main_divide", + "entityType": "columns", + "schema": "stats", + "table": "wo_country" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "stats", + "table": "wo_country" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "profile", + "entityType": "columns", + "schema": "stats", + "table": "wo_country" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sort", + "entityType": "columns", + "schema": "stats", + "table": "wo_country" + }, + { + "type": "char(3)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iso3", + "entityType": "columns", + "schema": "stats", + "table": "wo_cultural_map" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wave", + "entityType": "columns", + "schema": "stats", + "table": "wo_cultural_map" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year_from", + "entityType": "columns", + "schema": "stats", + "table": "wo_cultural_map" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year_to", + "entityType": "columns", + "schema": "stats", + "table": "wo_cultural_map" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "trad_secular", + "entityType": "columns", + "schema": "stats", + "table": "wo_cultural_map" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "surv_selfexp", + "entityType": "columns", + "schema": "stats", + "table": "wo_cultural_map" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "n", + "entityType": "columns", + "schema": "stats", + "table": "wo_cultural_map" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "stats", + "table": "wo_cultural_map" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sort", + "entityType": "columns", + "schema": "stats", + "table": "wo_narrative" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "event", + "entityType": "columns", + "schema": "stats", + "table": "wo_narrative" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "years", + "entityType": "columns", + "schema": "stats", + "table": "wo_narrative" + }, + { + "type": "jsonb", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "views", + "entityType": "columns", + "schema": "stats", + "table": "wo_narrative" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "party_id", + "entityType": "columns", + "schema": "stats", + "table": "wo_party" + }, + { + "type": "char(3)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iso3", + "entityType": "columns", + "schema": "stats", + "table": "wo_party" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "stats", + "table": "wo_party" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "abbrev", + "entityType": "columns", + "schema": "stats", + "table": "wo_party" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "family", + "entityType": "columns", + "schema": "stats", + "table": "wo_party" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ches_id", + "entityType": "columns", + "schema": "stats", + "table": "wo_party" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "manifesto_id", + "entityType": "columns", + "schema": "stats", + "table": "wo_party" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "vparty_id", + "entityType": "columns", + "schema": "stats", + "table": "wo_party" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "partyfacts_id", + "entityType": "columns", + "schema": "stats", + "table": "wo_party" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sort", + "entityType": "columns", + "schema": "stats", + "table": "wo_party" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "party_id", + "entityType": "columns", + "schema": "stats", + "table": "wo_party_position" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "stats", + "table": "wo_party_position" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "stats", + "table": "wo_party_position" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "dim", + "entityType": "columns", + "schema": "stats", + "table": "wo_party_position" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "wo_party_position" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "vote_share", + "entityType": "columns", + "schema": "stats", + "table": "wo_party_position" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "sort", + "entityType": "columns", + "schema": "stats", + "table": "wo_source" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "stats", + "table": "wo_source" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "href", + "entityType": "columns", + "schema": "stats", + "table": "wo_source" + }, + { + "type": "char(3)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "iso3", + "entityType": "columns", + "schema": "stats", + "table": "wo_value_score" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "wave", + "entityType": "columns", + "schema": "stats", + "table": "wo_value_score" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_code", + "entityType": "columns", + "schema": "stats", + "table": "wo_value_score" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "item_label", + "entityType": "columns", + "schema": "stats", + "table": "wo_value_score" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "stat", + "entityType": "columns", + "schema": "stats", + "table": "wo_value_score" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "stats", + "table": "wo_value_score" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "n", + "entityType": "columns", + "schema": "stats", + "table": "wo_value_score" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "match_id", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "kind", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "x", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "y", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "x2", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "y2", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "label", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "player", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "color", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "pubg_markers" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "pubg_matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "room_id", + "entityType": "columns", + "schema": "games", + "table": "pubg_matches" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "number", + "entityType": "columns", + "schema": "games", + "table": "pubg_matches" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "map", + "entityType": "columns", + "schema": "games", + "table": "pubg_matches" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "started_at", + "entityType": "columns", + "schema": "games", + "table": "pubg_matches" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ended_at", + "entityType": "columns", + "schema": "games", + "table": "pubg_matches" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "games", + "table": "pubg_rooms" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "code", + "entityType": "columns", + "schema": "games", + "table": "pubg_rooms" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "games", + "table": "pubg_rooms" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "games", + "table": "pubg_rooms" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "games", + "table": "pubg_rooms" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ai", + "table": "bot_status" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "ai", + "table": "bot_status" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "focus", + "entityType": "columns", + "schema": "ai", + "table": "bot_status" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "recent", + "entityType": "columns", + "schema": "ai", + "table": "bot_status" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_active", + "entityType": "columns", + "schema": "ai", + "table": "bot_status" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ai", + "table": "bot_status" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ai", + "table": "bot_status" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ai", + "table": "news_items" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "ai", + "table": "news_items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "ai", + "table": "news_items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "url", + "entityType": "columns", + "schema": "ai", + "table": "news_items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "ai", + "table": "news_items" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'ai'", + "generated": null, + "identity": null, + "name": "section", + "entityType": "columns", + "schema": "ai", + "table": "news_items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ai", + "table": "news_items" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ai", + "table": "news_items" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "ai", + "table": "usage_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "provider", + "entityType": "columns", + "schema": "ai", + "table": "usage_entries" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "date", + "entityType": "columns", + "schema": "ai", + "table": "usage_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metric", + "entityType": "columns", + "schema": "ai", + "table": "usage_entries" + }, + { + "type": "double precision", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "ai", + "table": "usage_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "unit", + "entityType": "columns", + "schema": "ai", + "table": "usage_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'manual'", + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "ai", + "table": "usage_entries" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "note", + "entityType": "columns", + "schema": "ai", + "table": "usage_entries" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "ai", + "table": "usage_entries" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "ai", + "table": "usage_entries" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "movies", + "table": "episodes" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title_id", + "entityType": "columns", + "schema": "movies", + "table": "episodes" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "ep_key", + "entityType": "columns", + "schema": "movies", + "table": "episodes" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "season", + "entityType": "columns", + "schema": "movies", + "table": "episodes" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "episode", + "entityType": "columns", + "schema": "movies", + "table": "episodes" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "name", + "entityType": "columns", + "schema": "movies", + "table": "episodes" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "runtime_min", + "entityType": "columns", + "schema": "movies", + "table": "episodes" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "movies", + "table": "episodes" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "movies", + "table": "episodes" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title_id", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "episode_id", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "date", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "watched_on", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "watched_at", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "duration_min", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'stan'", + "generated": null, + "identity": null, + "name": "who", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "platform", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source_key", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "movies", + "table": "plays" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "tmdb_id", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "for_whom", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "reason", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "added_at", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "poster_path", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "genres", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metadata_at", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "movies", + "table": "recs" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "key", + "entityType": "columns", + "schema": "movies", + "table": "settings" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "value", + "entityType": "columns", + "schema": "movies", + "table": "settings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "movies", + "table": "settings" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "movies", + "table": "settings" + }, + { + "type": "serial", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "type", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "tmdb_id", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "match_key", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "title", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "original_title", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "year", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'watched'", + "generated": null, + "identity": null, + "name": "status", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "real", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "rating", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "0", + "generated": null, + "identity": null, + "name": "rewatch_count", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "first_watched", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "date", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "last_watched", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "watched_by", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "platform", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "source", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "sources", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "notes", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'pending'", + "generated": null, + "identity": null, + "name": "match_status", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "poster_path", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "backdrop_path", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "overview", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "genres", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "text", + "typeSchema": null, + "notNull": true, + "dimensions": 1, + "default": "'{}'", + "generated": null, + "identity": null, + "name": "cast", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "runtime_min", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "total_seasons", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "integer", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "total_episodes", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "metadata_at", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "type": "timestamp with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "movies", + "table": "titles" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "account_userId_idx", + "entityType": "indexes", + "schema": "auth", + "table": "account" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "issuer", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "account_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "account_issuer_account_id_unique", + "entityType": "indexes", + "schema": "auth", + "table": "account" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "session_userId_idx", + "entityType": "indexes", + "schema": "auth", + "table": "session" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "identifier", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "verification_identifier_idx", + "entityType": "indexes", + "schema": "auth", + "table": "verification" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "pokemon_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "game_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "pokemon_encounters_pokemon_id_game_id_index", + "entityType": "indexes", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "location_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "pokemon_encounters_location_id_index", + "entityType": "indexes", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "game_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "pokemon_evolutions_game_id_index", + "entityType": "indexes", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "game_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "pokemon_game_entries_game_id_index", + "entityType": "indexes", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "catch_em_all_entries_user_id_index", + "entityType": "indexes", + "schema": "games", + "table": "catch_em_all_entries" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "catch_em_all_games_user_id_index", + "entityType": "indexes", + "schema": "games", + "table": "catch_em_all_games" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "game_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "tracker_items_game_id_index", + "entityType": "indexes", + "schema": "ref", + "table": "tracker_items" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "tracker_progress_user_id_index", + "entityType": "indexes", + "schema": "games", + "table": "tracker_progress" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "game", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "external_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "accounts_game_source_ext_idx", + "entityType": "indexes", + "schema": "games", + "table": "accounts" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "match_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "player_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "match_players_match_player_idx", + "entityType": "indexes", + "schema": "games", + "table": "match_players" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "player_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "match_players_player_idx", + "entityType": "indexes", + "schema": "games", + "table": "match_players" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "game", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "external_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "matches_source_ext_idx", + "entityType": "indexes", + "schema": "games", + "table": "matches" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "game", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "played_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "matches_game_played_idx", + "entityType": "indexes", + "schema": "games", + "table": "matches" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "game", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "season", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "board", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "seasons_key_idx", + "entityType": "indexes", + "schema": "games", + "table": "seasons" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "game", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "kind", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "taken_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "snapshots_game_kind_idx", + "entityType": "indexes", + "schema": "games", + "table": "snapshots" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "kind", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "osu_entries_user_id_kind_index", + "entityType": "indexes", + "schema": "games", + "table": "osu_entries" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "game_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "pokemon_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "pokemon_catches_user_id_game_id_pokemon_id_index", + "entityType": "indexes", + "schema": "games", + "table": "pokemon_catches" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "game_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "pokemon_dex_numbers_game_id_index", + "entityType": "indexes", + "schema": "ref", + "table": "pokemon_dex_numbers" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "pokemon_seen_user_id_index", + "entityType": "indexes", + "schema": "games", + "table": "pokemon_seen" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "table_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "columns_table_id_index", + "entityType": "indexes", + "schema": "meta", + "table": "columns" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "schema_name", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "table_name", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "edit_log_table_at_index", + "entityType": "indexes", + "schema": "meta", + "table": "edit_log" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "accounts_user_id_index", + "entityType": "indexes", + "schema": "money", + "table": "accounts" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "bank_sessions_user_id_index", + "entityType": "indexes", + "schema": "money", + "table": "bank_sessions" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "forecasts_user_id_date_index", + "entityType": "indexes", + "schema": "money", + "table": "forecasts" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "insurances_user_id_index", + "entityType": "indexes", + "schema": "money", + "table": "insurances" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "recurring_user_id_index", + "entityType": "indexes", + "schema": "money", + "table": "recurring" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "transactions_user_id_date_id_index", + "entityType": "indexes", + "schema": "money", + "table": "transactions" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "account_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "transactions_account_id_index", + "entityType": "indexes", + "schema": "money", + "table": "transactions" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "kind", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "utility_readings_user_id_kind_date_index", + "entityType": "indexes", + "schema": "money", + "table": "utility_readings" + }, + { + "nameExplicit": false, + "columns": [ + { + "value": "user_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "wishlist_user_id_index", + "entityType": "indexes", + "schema": "money", + "table": "wishlist" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "key", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "value", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "item_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "item_dimensions_filter_idx", + "entityType": "indexes", + "schema": "cs", + "table": "item_dimensions" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "market_hash_name", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "items_hash_idx", + "entityType": "indexes", + "schema": "cs", + "table": "items" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "name", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "items_name_idx", + "entityType": "indexes", + "schema": "cs", + "table": "items" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "item_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "currency", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "observed_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "kind", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "price_observations_unique_idx", + "entityType": "indexes", + "schema": "cs", + "table": "price_observations" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "item_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "currency", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "observed_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "price_observations_lookup_idx", + "entityType": "indexes", + "schema": "cs", + "table": "price_observations" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "observed_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "price_observations_time_idx", + "entityType": "indexes", + "schema": "cs", + "table": "price_observations" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "source_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "listings_source_idx", + "entityType": "indexes", + "schema": "house", + "table": "listings" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "offer", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "first_seen_at", + "isExpression": false, + "asc": false, + "nullsFirst": true, + "opclass": null + } + ], + "isUnique": false, + "where": "removed_at IS NULL", + "with": "", + "method": "btree", + "concurrently": false, + "name": "listings_active_idx", + "entityType": "indexes", + "schema": "house", + "table": "listings" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "offer", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "city_slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "listings_city_idx", + "entityType": "indexes", + "schema": "house", + "table": "listings" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "first_seen_at", + "isExpression": false, + "asc": false, + "nullsFirst": true, + "opclass": null + } + ], + "isUnique": false, + "where": "detail_fetched_at IS NULL", + "with": "", + "method": "btree", + "concurrently": false, + "name": "listings_details_idx", + "entityType": "indexes", + "schema": "house", + "table": "listings" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "contact_status", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": "contact_status IS NOT NULL", + "with": "", + "method": "btree", + "concurrently": false, + "name": "listings_contact_idx", + "entityType": "indexes", + "schema": "house", + "table": "listings" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "address_key", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": "address_key IS NOT NULL", + "with": "", + "method": "btree", + "concurrently": false, + "name": "listings_address_idx", + "entityType": "indexes", + "schema": "house", + "table": "listings" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "created_at", + "isExpression": false, + "asc": false, + "nullsFirst": true, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "worker_runs_created_idx", + "entityType": "indexes", + "schema": "house", + "table": "worker_runs" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "appointments_date_idx", + "entityType": "indexes", + "schema": "health", + "table": "appointments" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "body_measurements_date_idx", + "entityType": "indexes", + "schema": "health", + "table": "body_measurements" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "weight_kg", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "body_measurements_date_weight_key", + "entityType": "indexes", + "schema": "health", + "table": "body_measurements" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "measured_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "body_measurements_measured_at_key", + "entityType": "indexes", + "schema": "health", + "table": "body_measurements" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "start_date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "medications_start_date_idx", + "entityType": "indexes", + "schema": "health", + "table": "medications" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "stop_date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "medications_stop_date_idx", + "entityType": "indexes", + "schema": "health", + "table": "medications" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "vaccinations_date_idx", + "entityType": "indexes", + "schema": "health", + "table": "vaccinations" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "workouts_date_idx", + "entityType": "indexes", + "schema": "health", + "table": "workouts" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "session_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "workouts_session_idx", + "entityType": "indexes", + "schema": "health", + "table": "workouts" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "merged_into", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "deleted_works_merged_into_idx", + "entityType": "indexes", + "schema": "books", + "table": "deleted_works" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "path", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "files_path_key", + "entityType": "indexes", + "schema": "books", + "table": "files" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "sha256", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "files_sha256_key", + "entityType": "indexes", + "schema": "books", + "table": "files" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "work_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "files_work_id_idx", + "entityType": "indexes", + "schema": "books", + "table": "files" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "work_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "notes_work_id_idx", + "entityType": "indexes", + "schema": "books", + "table": "notes" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "work_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "progress_work_id_key", + "entityType": "indexes", + "schema": "books", + "table": "progress" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "status", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "progress_status_idx", + "entityType": "indexes", + "schema": "books", + "table": "progress" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "work_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "sessions_work_id_idx", + "entityType": "indexes", + "schema": "books", + "table": "sessions" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "started_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "sessions_started_at_idx", + "entityType": "indexes", + "schema": "books", + "table": "sessions" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "work_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "shelf_works_work_id_idx", + "entityType": "indexes", + "schema": "books", + "table": "shelf_works" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "shelves_slug_key", + "entityType": "indexes", + "schema": "books", + "table": "shelves" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "url", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": "\"url\" is not null", + "with": "", + "method": "btree", + "concurrently": false, + "name": "works_url_key", + "entityType": "indexes", + "schema": "books", + "table": "works" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "kind", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "works_kind_idx", + "entityType": "indexes", + "schema": "books", + "table": "works" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "archived_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "works_archived_at_idx", + "entityType": "indexes", + "schema": "books", + "table": "works" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "isbn13", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": "\"isbn13\" is not null", + "with": "", + "method": "btree", + "concurrently": false, + "name": "works_isbn13_key", + "entityType": "indexes", + "schema": "books", + "table": "works" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "lower(\"title\")", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "works_title_idx", + "entityType": "indexes", + "schema": "books", + "table": "works" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "task_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "created_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "activity_task_idx", + "entityType": "indexes", + "schema": "tasks", + "table": "activity" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "goal_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "created_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "activity_goal_idx", + "entityType": "indexes", + "schema": "tasks", + "table": "activity" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "areas_slug_key", + "entityType": "indexes", + "schema": "tasks", + "table": "areas" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "lower(\"title\")", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "goals_title_key", + "entityType": "indexes", + "schema": "tasks", + "table": "goals" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "area_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "tasks_area_idx", + "entityType": "indexes", + "schema": "tasks", + "table": "tasks" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "goal_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "tasks_goal_idx", + "entityType": "indexes", + "schema": "tasks", + "table": "tasks" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "parent_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "tasks_parent_idx", + "entityType": "indexes", + "schema": "tasks", + "table": "tasks" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "status", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "due_date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "tasks_status_due_idx", + "entityType": "indexes", + "schema": "tasks", + "table": "tasks" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "tags", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "gin", + "concurrently": false, + "name": "tasks_tags_idx", + "entityType": "indexes", + "schema": "tasks", + "table": "tasks" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "external_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": "\"external_id\" IS NOT NULL", + "with": "", + "method": "btree", + "concurrently": false, + "name": "tasks_source_external_key", + "entityType": "indexes", + "schema": "tasks", + "table": "tasks" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "categories_slug_key", + "entityType": "indexes", + "schema": "groceries", + "table": "categories" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "parent_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "categories_parent_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "categories" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "key", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "groups_key_key", + "entityType": "indexes", + "schema": "groceries", + "table": "groups" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "family_key", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "groups_family_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "groups" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "category", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "groups_category_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "groups" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "category_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "groups_category_id_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "groups" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "store_ids", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "gin", + "concurrently": false, + "name": "groups_store_ids_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "groups" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "\"search_text\" gin_trgm_ops", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "gin", + "concurrently": false, + "name": "groups_search_trgm_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "groups" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "store_count", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "name", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "groups_list_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "groups" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "store_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "started_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "import_runs_store_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "import_runs" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "item_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "observed_on", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "item_prices_item_day_key", + "entityType": "indexes", + "schema": "groceries", + "table": "item_prices" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "item_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "observed_on", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "item_sizes_item_day_key", + "entityType": "indexes", + "schema": "groceries", + "table": "item_sizes" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "store_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "store_product_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "items_store_product_key", + "entityType": "indexes", + "schema": "groceries", + "table": "items" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "group_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "items_group_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "items" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "gtin", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "items_gtin_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "items" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "category_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "items_category_id_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "items" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "\"name\" gin_trgm_ops", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "gin", + "concurrently": false, + "name": "items_name_trgm_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "items" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "group_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "observed_on", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "manual_prices_group_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "manual_prices" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "item_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "manual_prices_item_idx", + "entityType": "indexes", + "schema": "groceries", + "table": "manual_prices" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "computed_on", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "scope", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "stats_snapshots_day_scope_key", + "entityType": "indexes", + "schema": "groceries", + "table": "stats_snapshots" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "stores_slug_key", + "entityType": "indexes", + "schema": "groceries", + "table": "stores" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "term", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "synonym", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "synonyms_term_synonym_key", + "entityType": "indexes", + "schema": "groceries", + "table": "synonyms" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "section", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "sort_order", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "links_sort_idx", + "entityType": "indexes", + "schema": "home", + "table": "links" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "area", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "score", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "activity_area_score_idx", + "entityType": "indexes", + "schema": "cars", + "table": "activity" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "brands_slug_key", + "entityType": "indexes", + "schema": "cars", + "table": "brands" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "dex", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "models_dex_key", + "entityType": "indexes", + "schema": "cars", + "table": "models" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "brand_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "models_brand_slug_key", + "entityType": "indexes", + "schema": "cars", + "table": "models" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "nl_count", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "models_nl_count_idx", + "entityType": "indexes", + "schema": "cars", + "table": "models" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "\"search\" public.gin_trgm_ops", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "gin", + "concurrently": false, + "name": "models_search_trgm_idx", + "entityType": "indexes", + "schema": "cars", + "table": "models" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "model_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "position", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "photos_model_position_key", + "entityType": "indexes", + "schema": "cars", + "table": "photos" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "model_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "year", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "variants_model_year_idx", + "entityType": "indexes", + "schema": "cars", + "table": "variants" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "area", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "score", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "activity_area_score_idx", + "entityType": "indexes", + "schema": "planes", + "table": "activity" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "makers_slug_key", + "entityType": "indexes", + "schema": "planes", + "table": "makers" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "type_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "position", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "photos_type_position_key", + "entityType": "indexes", + "schema": "planes", + "table": "photos" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "dex", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_dex_key", + "entityType": "indexes", + "schema": "planes", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "wikidata", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_wikidata_key", + "entityType": "indexes", + "schema": "planes", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "maker_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_maker_slug_key", + "entityType": "indexes", + "schema": "planes", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "number_built", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_number_built_idx", + "entityType": "indexes", + "schema": "planes", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "first_flight_year", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_first_flight_year_idx", + "entityType": "indexes", + "schema": "planes", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "\"search\" public.gin_trgm_ops", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "gin", + "concurrently": false, + "name": "types_search_trgm_idx", + "entityType": "indexes", + "schema": "planes", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "area", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "score", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "activity_area_score_idx", + "entityType": "indexes", + "schema": "wildlife", + "table": "activity" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "groups_slug_key", + "entityType": "indexes", + "schema": "wildlife", + "table": "groups" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "species_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "position", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "photos_species_position_key", + "entityType": "indexes", + "schema": "wildlife", + "table": "photos" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "species_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "photo_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "photos_species_photo_key", + "entityType": "indexes", + "schema": "wildlife", + "table": "photos" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "dex", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "species_dex_key", + "entityType": "indexes", + "schema": "wildlife", + "table": "species" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "inat_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "species_inat_key", + "entityType": "indexes", + "schema": "wildlife", + "table": "species" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "species_slug_key", + "entityType": "indexes", + "schema": "wildlife", + "table": "species" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "group_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "species_group_idx", + "entityType": "indexes", + "schema": "wildlife", + "table": "species" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "nl_obs", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "species_nl_obs_idx", + "entityType": "indexes", + "schema": "wildlife", + "table": "species" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "\"search\" public.gin_trgm_ops", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "gin", + "concurrently": false, + "name": "species_search_trgm_idx", + "entityType": "indexes", + "schema": "wildlife", + "table": "species" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "area", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "score", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "activity_area_score_idx", + "entityType": "indexes", + "schema": "trains", + "table": "activity" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "makers_slug_key", + "entityType": "indexes", + "schema": "trains", + "table": "makers" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "operators_slug_key", + "entityType": "indexes", + "schema": "trains", + "table": "operators" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "type_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "position", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "photos_type_position_key", + "entityType": "indexes", + "schema": "trains", + "table": "photos" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "operator_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "type_operators_operator_idx", + "entityType": "indexes", + "schema": "trains", + "table": "type_operators" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "dex", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_dex_key", + "entityType": "indexes", + "schema": "trains", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "wikidata", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_wikidata_key", + "entityType": "indexes", + "schema": "trains", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "maker_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "slug", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_maker_slug_key", + "entityType": "indexes", + "schema": "trains", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "number_built", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_number_built_idx", + "entityType": "indexes", + "schema": "trains", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "first_built", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_first_built_idx", + "entityType": "indexes", + "schema": "trains", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "category", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "types_category_idx", + "entityType": "indexes", + "schema": "trains", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "\"search\" public.gin_trgm_ops", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "gin", + "concurrently": false, + "name": "types_search_trgm_idx", + "entityType": "indexes", + "schema": "trains", + "table": "types" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "spotify_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": "\"spotify_id\" is not null", + "with": "", + "method": "btree", + "concurrently": false, + "name": "albums_spotify_id_key", + "entityType": "indexes", + "schema": "music", + "table": "albums" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "lower(\"name\")", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "albums_name_idx", + "entityType": "indexes", + "schema": "music", + "table": "albums" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "tag", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "artist_tags_tag_idx", + "entityType": "indexes", + "schema": "music", + "table": "artist_tags" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "spotify_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": "\"spotify_id\" is not null", + "with": "", + "method": "btree", + "concurrently": false, + "name": "artists_spotify_id_key", + "entityType": "indexes", + "schema": "music", + "table": "artists" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "lower(\"name\")", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "artists_name_idx", + "entityType": "indexes", + "schema": "music", + "table": "artists" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "track_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "played_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "plays_dedupe_key", + "entityType": "indexes", + "schema": "music", + "table": "plays" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "played_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "plays_played_at_idx", + "entityType": "indexes", + "schema": "music", + "table": "plays" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "played_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "plays_source_played_idx", + "entityType": "indexes", + "schema": "music", + "table": "plays" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "track_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "played_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "plays_track_played_idx", + "entityType": "indexes", + "schema": "music", + "table": "plays" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "artist_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "track_artists_artist_idx", + "entityType": "indexes", + "schema": "music", + "table": "track_artists" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "spotify_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": "\"spotify_id\" is not null", + "with": "", + "method": "btree", + "concurrently": false, + "name": "tracks_spotify_id_key", + "entityType": "indexes", + "schema": "music", + "table": "tracks" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "lower(\"name\")", + "isExpression": true, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "tracks_name_idx", + "entityType": "indexes", + "schema": "music", + "table": "tracks" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "match_key", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "tracks_match_key_idx", + "entityType": "indexes", + "schema": "music", + "table": "tracks" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "device_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "components_device_idx", + "entityType": "indexes", + "schema": "hardware", + "table": "components" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "category", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "components_category_idx", + "entityType": "indexes", + "schema": "hardware", + "table": "components" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "specs", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "gin", + "concurrently": false, + "name": "components_specs_gin", + "entityType": "indexes", + "schema": "hardware", + "table": "components" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "installed_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "removed_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "components_timeline_idx", + "entityType": "indexes", + "schema": "hardware", + "table": "components" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "import_key", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "orgs_import_key_key", + "entityType": "indexes", + "schema": "dataholders", + "table": "orgs" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "category", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "orgs_category_idx", + "entityType": "indexes", + "schema": "dataholders", + "table": "orgs" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "table_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "measure", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "cbs_obs_table_measure_idx", + "entityType": "indexes", + "schema": "stats", + "table": "cbs_obs" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "level", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "area_code", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "elec_result_area_idx", + "entityType": "indexes", + "schema": "stats", + "table": "elec_result" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "dataset", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "geo", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "eurostat_obs_dataset_geo_idx", + "entityType": "indexes", + "schema": "stats", + "table": "eurostat_obs" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "source_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "started_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "fetch_run_source_idx", + "entityType": "indexes", + "schema": "stats", + "table": "fetch_run" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "series", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "fieldwork_end", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "op_poll_series_date_idx", + "entityType": "indexes", + "schema": "stats", + "table": "op_poll" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "year", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "vuo", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "chapter", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "rf_budget_table_chapter_idx", + "entityType": "indexes", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "theme", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "series_theme_idx", + "entityType": "indexes", + "schema": "stats", + "table": "series" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "source_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "series_source_idx", + "entityType": "indexes", + "schema": "stats", + "table": "series" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "iso3", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "wo_party_iso3_idx", + "entityType": "indexes", + "schema": "stats", + "table": "wo_party" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "match_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "pubg_markers_match_idx", + "entityType": "indexes", + "schema": "games", + "table": "pubg_markers" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "room_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "number", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "pubg_matches_room_number_idx", + "entityType": "indexes", + "schema": "games", + "table": "pubg_matches" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "map", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "started_at", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "pubg_matches_map_idx", + "entityType": "indexes", + "schema": "games", + "table": "pubg_matches" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "name", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "bot_status_name_key", + "entityType": "indexes", + "schema": "ai", + "table": "bot_status" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "url", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "news_items_url_key", + "entityType": "indexes", + "schema": "ai", + "table": "news_items" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "news_items_date_idx", + "entityType": "indexes", + "schema": "ai", + "table": "news_items" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "provider", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "metric", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "source", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "usage_entries_day_key", + "entityType": "indexes", + "schema": "ai", + "table": "usage_entries" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "provider", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "metric", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "date", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "usage_entries_provider_idx", + "entityType": "indexes", + "schema": "ai", + "table": "usage_entries" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "title_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "ep_key", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "episodes_title_key", + "entityType": "indexes", + "schema": "movies", + "table": "episodes" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "title_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "season", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "episode", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "episodes_title_idx", + "entityType": "indexes", + "schema": "movies", + "table": "episodes" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "source_key", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "plays_source_key", + "entityType": "indexes", + "schema": "movies", + "table": "plays" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "title_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "plays_title_idx", + "entityType": "indexes", + "schema": "movies", + "table": "plays" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "watched_on", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "plays_watched_idx", + "entityType": "indexes", + "schema": "movies", + "table": "plays" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "type", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "tmdb_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "recs_tmdb_key", + "entityType": "indexes", + "schema": "movies", + "table": "recs" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "type", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + }, + { + "value": "tmdb_id", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": "\"tmdb_id\" IS NOT NULL", + "with": "", + "method": "btree", + "concurrently": false, + "name": "titles_tmdb_key", + "entityType": "indexes", + "schema": "movies", + "table": "titles" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "match_key", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "titles_match_key", + "entityType": "indexes", + "schema": "movies", + "table": "titles" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "status", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": false, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "titles_status_idx", + "entityType": "indexes", + "schema": "movies", + "table": "titles" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "account_user_id_user_id_fkey", + "entityType": "fks", + "schema": "auth", + "table": "account" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "session_user_id_user_id_fkey", + "entityType": "fks", + "schema": "auth", + "table": "session" + }, + { + "nameExplicit": false, + "columns": [ + "task_id" + ], + "schemaTo": "site", + "tableTo": "tasks", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "task_topics_task_id_tasks_id_fkey", + "entityType": "fks", + "schema": "site", + "table": "task_topics" + }, + { + "nameExplicit": false, + "columns": [ + "topic_id" + ], + "schemaTo": "site", + "tableTo": "topics", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "task_topics_topic_id_topics_id_fkey", + "entityType": "fks", + "schema": "site", + "table": "task_topics" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "catch_em_all_settings_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "catch_em_all_settings" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_encounters_pokemon_id_pokemon_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_encounters_game_id_pokemon_games_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "nameExplicit": false, + "columns": [ + "location_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_locations", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_encounters_location_id_pokemon_locations_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_encounters" + }, + { + "nameExplicit": false, + "columns": [ + "from_pokemon_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_evolutions_from_pokemon_id_pokemon_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "nameExplicit": false, + "columns": [ + "to_pokemon_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_evolutions_to_pokemon_id_pokemon_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_evolutions_game_id_pokemon_games_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_game_entries_pokemon_id_pokemon_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_game_entries_game_id_pokemon_games_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_game_entry_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_game_entries", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "catch_em_all_entries_HeABXvGNiB6D_fkey", + "entityType": "fks", + "schema": "games", + "table": "catch_em_all_entries" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "catch_em_all_entries_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "catch_em_all_entries" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "catch_em_all_games_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "catch_em_all_games" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "catch_em_all_games_game_id_pokemon_games_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "catch_em_all_games" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "tracker_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tracker_items_game_id_tracker_games_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "tracker_items" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tracker_progress_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "tracker_progress" + }, + { + "nameExplicit": false, + "columns": [ + "item_id" + ], + "schemaTo": "ref", + "tableTo": "tracker_items", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tracker_progress_item_id_tracker_items_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "tracker_progress" + }, + { + "nameExplicit": false, + "columns": [ + "match_id" + ], + "schemaTo": "games", + "tableTo": "matches", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "match_players_match_id_matches_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "match_players" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "osu_entries_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "osu_entries" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_catches_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pokemon_catches" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_catches_game_id_pokemon_games_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pokemon_catches" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_catches_pokemon_id_pokemon_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pokemon_catches" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_dex_numbers_pokemon_id_pokemon_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_dex_numbers" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_dex_numbers_game_id_pokemon_games_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_dex_numbers" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_game_research_game_id_pokemon_games_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_game_research" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_journeys_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_journeys_game_id_pokemon_games_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_learnsets_pokemon_id_pokemon_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_learnsets" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_milestones_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_milestones_game_id_pokemon_games_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_research_pokemon_id_pokemon_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "pokemon_research" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_seen_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pokemon_seen" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_seen_game_id_pokemon_games_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pokemon_seen" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_id" + ], + "schemaTo": "ref", + "tableTo": "pokemon", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pokemon_seen_pokemon_id_pokemon_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pokemon_seen" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tracker_challenge_progress_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "nameExplicit": false, + "columns": [ + "challenge_id" + ], + "schemaTo": "ref", + "tableTo": "tracker_challenges", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tracker_challenge_progress_HtzyFtOyUAhk_fkey", + "entityType": "fks", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "tracker_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tracker_challenges_game_id_tracker_games_id_fkey", + "entityType": "fks", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tracker_ranks_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "tracker_ranks" + }, + { + "nameExplicit": false, + "columns": [ + "game_id" + ], + "schemaTo": "ref", + "tableTo": "tracker_games", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tracker_ranks_game_id_tracker_games_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "tracker_ranks" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tracker_weapon_ranks_user_id_user_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "nameExplicit": false, + "columns": [ + "item_id" + ], + "schemaTo": "ref", + "tableTo": "tracker_items", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tracker_weapon_ranks_item_id_tracker_items_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "nameExplicit": false, + "columns": [ + "sighting_id" + ], + "schemaTo": "animaldex", + "tableTo": "sightings", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "sighting_photos_sighting_id_sightings_id_fkey", + "entityType": "fks", + "schema": "animaldex", + "table": "sighting_photos" + }, + { + "nameExplicit": false, + "columns": [ + "animal_id" + ], + "schemaTo": "animaldex", + "tableTo": "animals", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "sightings_animal_id_animals_id_fkey", + "entityType": "fks", + "schema": "animaldex", + "table": "sightings" + }, + { + "nameExplicit": false, + "columns": [ + "table_id" + ], + "schemaTo": "meta", + "tableTo": "tables", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "columns_table_id_tables_id_fkey", + "entityType": "fks", + "schema": "meta", + "table": "columns" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "accounts_user_id_user_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "accounts" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "bank_sessions_user_id_user_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "bank_sessions" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "forecasts_user_id_user_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "forecasts" + }, + { + "nameExplicit": false, + "columns": [ + "account_id" + ], + "schemaTo": "money", + "tableTo": "accounts", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "forecasts_account_id_accounts_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "forecasts" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "insurances_user_id_user_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "insurances" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "projection_settings_user_id_user_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "projection_settings" + }, + { + "nameExplicit": false, + "columns": [ + "investment_account_id" + ], + "schemaTo": "money", + "tableTo": "accounts", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "projection_settings_investment_account_id_accounts_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "projection_settings" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "recurring_user_id_user_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "recurring" + }, + { + "nameExplicit": false, + "columns": [ + "account_id" + ], + "schemaTo": "money", + "tableTo": "accounts", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "recurring_account_id_accounts_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "recurring" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "transactions_user_id_user_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "transactions" + }, + { + "nameExplicit": false, + "columns": [ + "account_id" + ], + "schemaTo": "money", + "tableTo": "accounts", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "NO ACTION", + "name": "transactions_account_id_accounts_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "transactions" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "utility_readings_user_id_user_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "utility_readings" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "utility_settings_user_id_user_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "utility_settings" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "schemaTo": "auth", + "tableTo": "user", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "wishlist_user_id_user_id_fkey", + "entityType": "fks", + "schema": "money", + "table": "wishlist" + }, + { + "nameExplicit": false, + "columns": [ + "item_id" + ], + "schemaTo": "cs", + "tableTo": "items", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "item_dimensions_item_id_items_id_fkey", + "entityType": "fks", + "schema": "cs", + "table": "item_dimensions" + }, + { + "nameExplicit": false, + "columns": [ + "item_id" + ], + "schemaTo": "cs", + "tableTo": "items", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "price_observations_item_id_items_id_fkey", + "entityType": "fks", + "schema": "cs", + "table": "price_observations" + }, + { + "nameExplicit": false, + "columns": [ + "duplicate_of" + ], + "schemaTo": "house", + "tableTo": "listings", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "listings_duplicate_of_listings_id_fkey", + "entityType": "fks", + "schema": "house", + "table": "listings" + }, + { + "nameExplicit": false, + "columns": [ + "listing_id" + ], + "schemaTo": "house", + "tableTo": "listings", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "price_history_listing_id_listings_id_fkey", + "entityType": "fks", + "schema": "house", + "table": "price_history" + }, + { + "nameExplicit": false, + "columns": [ + "merged_into" + ], + "schemaTo": "books", + "tableTo": "works", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "deleted_works_merged_into_works_id_fkey", + "entityType": "fks", + "schema": "books", + "table": "deleted_works" + }, + { + "nameExplicit": false, + "columns": [ + "work_id" + ], + "schemaTo": "books", + "tableTo": "works", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "files_work_id_works_id_fkey", + "entityType": "fks", + "schema": "books", + "table": "files" + }, + { + "nameExplicit": false, + "columns": [ + "work_id" + ], + "schemaTo": "books", + "tableTo": "works", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "notes_work_id_works_id_fkey", + "entityType": "fks", + "schema": "books", + "table": "notes" + }, + { + "nameExplicit": false, + "columns": [ + "file_id" + ], + "schemaTo": "books", + "tableTo": "files", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "notes_file_id_files_id_fkey", + "entityType": "fks", + "schema": "books", + "table": "notes" + }, + { + "nameExplicit": false, + "columns": [ + "work_id" + ], + "schemaTo": "books", + "tableTo": "works", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "progress_work_id_works_id_fkey", + "entityType": "fks", + "schema": "books", + "table": "progress" + }, + { + "nameExplicit": false, + "columns": [ + "file_id" + ], + "schemaTo": "books", + "tableTo": "files", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "progress_file_id_files_id_fkey", + "entityType": "fks", + "schema": "books", + "table": "progress" + }, + { + "nameExplicit": false, + "columns": [ + "work_id" + ], + "schemaTo": "books", + "tableTo": "works", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "sessions_work_id_works_id_fkey", + "entityType": "fks", + "schema": "books", + "table": "sessions" + }, + { + "nameExplicit": false, + "columns": [ + "file_id" + ], + "schemaTo": "books", + "tableTo": "files", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "sessions_file_id_files_id_fkey", + "entityType": "fks", + "schema": "books", + "table": "sessions" + }, + { + "nameExplicit": false, + "columns": [ + "shelf_id" + ], + "schemaTo": "books", + "tableTo": "shelves", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "shelf_works_shelf_id_shelves_id_fkey", + "entityType": "fks", + "schema": "books", + "table": "shelf_works" + }, + { + "nameExplicit": false, + "columns": [ + "work_id" + ], + "schemaTo": "books", + "tableTo": "works", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "shelf_works_work_id_works_id_fkey", + "entityType": "fks", + "schema": "books", + "table": "shelf_works" + }, + { + "nameExplicit": false, + "columns": [ + "task_id" + ], + "schemaTo": "tasks", + "tableTo": "tasks", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "activity_task_id_tasks_id_fkey", + "entityType": "fks", + "schema": "tasks", + "table": "activity" + }, + { + "nameExplicit": false, + "columns": [ + "goal_id" + ], + "schemaTo": "tasks", + "tableTo": "goals", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "activity_goal_id_goals_id_fkey", + "entityType": "fks", + "schema": "tasks", + "table": "activity" + }, + { + "nameExplicit": false, + "columns": [ + "area_id" + ], + "schemaTo": "tasks", + "tableTo": "areas", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "goals_area_id_areas_id_fkey", + "entityType": "fks", + "schema": "tasks", + "table": "goals" + }, + { + "nameExplicit": false, + "columns": [ + "area_id" + ], + "schemaTo": "tasks", + "tableTo": "areas", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "tasks_area_id_areas_id_fkey", + "entityType": "fks", + "schema": "tasks", + "table": "tasks" + }, + { + "nameExplicit": false, + "columns": [ + "goal_id" + ], + "schemaTo": "tasks", + "tableTo": "goals", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "tasks_goal_id_goals_id_fkey", + "entityType": "fks", + "schema": "tasks", + "table": "tasks" + }, + { + "nameExplicit": false, + "columns": [ + "parent_id" + ], + "schemaTo": "tasks", + "tableTo": "tasks", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "tasks_parent_id_tasks_id_fkey", + "entityType": "fks", + "schema": "tasks", + "table": "tasks" + }, + { + "nameExplicit": false, + "columns": [ + "parent_id" + ], + "schemaTo": "groceries", + "tableTo": "categories", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "categories_parent_id_categories_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "categories" + }, + { + "nameExplicit": false, + "columns": [ + "category_id" + ], + "schemaTo": "groceries", + "tableTo": "categories", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "groups_category_id_categories_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "groups" + }, + { + "nameExplicit": false, + "columns": [ + "merged_into_id" + ], + "schemaTo": "groceries", + "tableTo": "groups", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "groups_merged_into_id_groups_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "groups" + }, + { + "nameExplicit": false, + "columns": [ + "store_id" + ], + "schemaTo": "groceries", + "tableTo": "stores", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "import_runs_store_id_stores_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "import_runs" + }, + { + "nameExplicit": false, + "columns": [ + "item_id" + ], + "schemaTo": "groceries", + "tableTo": "items", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "item_prices_item_id_items_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "item_prices" + }, + { + "nameExplicit": false, + "columns": [ + "item_id" + ], + "schemaTo": "groceries", + "tableTo": "items", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "item_sizes_item_id_items_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "item_sizes" + }, + { + "nameExplicit": false, + "columns": [ + "store_id" + ], + "schemaTo": "groceries", + "tableTo": "stores", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "items_store_id_stores_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "items" + }, + { + "nameExplicit": false, + "columns": [ + "category_id" + ], + "schemaTo": "groceries", + "tableTo": "categories", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "items_category_id_categories_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "items" + }, + { + "nameExplicit": false, + "columns": [ + "group_id" + ], + "schemaTo": "groceries", + "tableTo": "groups", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "items_group_id_groups_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "items" + }, + { + "nameExplicit": false, + "columns": [ + "store_id" + ], + "schemaTo": "groceries", + "tableTo": "stores", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "manual_prices_store_id_stores_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "manual_prices" + }, + { + "nameExplicit": false, + "columns": [ + "group_id" + ], + "schemaTo": "groceries", + "tableTo": "groups", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "manual_prices_group_id_groups_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "manual_prices" + }, + { + "nameExplicit": false, + "columns": [ + "item_id" + ], + "schemaTo": "groceries", + "tableTo": "items", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "manual_prices_item_id_items_id_fkey", + "entityType": "fks", + "schema": "groceries", + "table": "manual_prices" + }, + { + "nameExplicit": false, + "columns": [ + "model_id" + ], + "schemaTo": "cars", + "tableTo": "models", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "activity_model_id_models_id_fkey", + "entityType": "fks", + "schema": "cars", + "table": "activity" + }, + { + "nameExplicit": false, + "columns": [ + "brand_id" + ], + "schemaTo": "cars", + "tableTo": "brands", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "models_brand_id_brands_id_fkey", + "entityType": "fks", + "schema": "cars", + "table": "models" + }, + { + "nameExplicit": false, + "columns": [ + "model_id" + ], + "schemaTo": "cars", + "tableTo": "models", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "photos_model_id_models_id_fkey", + "entityType": "fks", + "schema": "cars", + "table": "photos" + }, + { + "nameExplicit": false, + "columns": [ + "model_id" + ], + "schemaTo": "cars", + "tableTo": "models", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "seen_model_id_models_id_fkey", + "entityType": "fks", + "schema": "cars", + "table": "seen" + }, + { + "nameExplicit": false, + "columns": [ + "model_id" + ], + "schemaTo": "cars", + "tableTo": "models", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "variants_model_id_models_id_fkey", + "entityType": "fks", + "schema": "cars", + "table": "variants" + }, + { + "nameExplicit": false, + "columns": [ + "type_id" + ], + "schemaTo": "planes", + "tableTo": "types", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "activity_type_id_types_id_fkey", + "entityType": "fks", + "schema": "planes", + "table": "activity" + }, + { + "nameExplicit": false, + "columns": [ + "type_id" + ], + "schemaTo": "planes", + "tableTo": "types", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "photos_type_id_types_id_fkey", + "entityType": "fks", + "schema": "planes", + "table": "photos" + }, + { + "nameExplicit": false, + "columns": [ + "type_id" + ], + "schemaTo": "planes", + "tableTo": "types", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "seen_type_id_types_id_fkey", + "entityType": "fks", + "schema": "planes", + "table": "seen" + }, + { + "nameExplicit": false, + "columns": [ + "maker_id" + ], + "schemaTo": "planes", + "tableTo": "makers", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "types_maker_id_makers_id_fkey", + "entityType": "fks", + "schema": "planes", + "table": "types" + }, + { + "nameExplicit": false, + "columns": [ + "family_id" + ], + "schemaTo": "planes", + "tableTo": "types", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "types_family_id_types_id_fkey", + "entityType": "fks", + "schema": "planes", + "table": "types" + }, + { + "nameExplicit": false, + "columns": [ + "species_id" + ], + "schemaTo": "wildlife", + "tableTo": "species", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "activity_species_id_species_id_fkey", + "entityType": "fks", + "schema": "wildlife", + "table": "activity" + }, + { + "nameExplicit": false, + "columns": [ + "species_id" + ], + "schemaTo": "wildlife", + "tableTo": "species", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "photos_species_id_species_id_fkey", + "entityType": "fks", + "schema": "wildlife", + "table": "photos" + }, + { + "nameExplicit": false, + "columns": [ + "species_id" + ], + "schemaTo": "wildlife", + "tableTo": "species", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "seen_species_id_species_id_fkey", + "entityType": "fks", + "schema": "wildlife", + "table": "seen" + }, + { + "nameExplicit": false, + "columns": [ + "group_id" + ], + "schemaTo": "wildlife", + "tableTo": "groups", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "species_group_id_groups_id_fkey", + "entityType": "fks", + "schema": "wildlife", + "table": "species" + }, + { + "nameExplicit": false, + "columns": [ + "type_id" + ], + "schemaTo": "trains", + "tableTo": "types", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "activity_type_id_types_id_fkey", + "entityType": "fks", + "schema": "trains", + "table": "activity" + }, + { + "nameExplicit": false, + "columns": [ + "type_id" + ], + "schemaTo": "trains", + "tableTo": "types", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "photos_type_id_types_id_fkey", + "entityType": "fks", + "schema": "trains", + "table": "photos" + }, + { + "nameExplicit": false, + "columns": [ + "type_id" + ], + "schemaTo": "trains", + "tableTo": "types", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "seen_type_id_types_id_fkey", + "entityType": "fks", + "schema": "trains", + "table": "seen" + }, + { + "nameExplicit": false, + "columns": [ + "type_id" + ], + "schemaTo": "trains", + "tableTo": "types", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "type_operators_type_id_types_id_fkey", + "entityType": "fks", + "schema": "trains", + "table": "type_operators" + }, + { + "nameExplicit": false, + "columns": [ + "operator_id" + ], + "schemaTo": "trains", + "tableTo": "operators", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "type_operators_operator_id_operators_id_fkey", + "entityType": "fks", + "schema": "trains", + "table": "type_operators" + }, + { + "nameExplicit": false, + "columns": [ + "maker_id" + ], + "schemaTo": "trains", + "tableTo": "makers", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "types_maker_id_makers_id_fkey", + "entityType": "fks", + "schema": "trains", + "table": "types" + }, + { + "nameExplicit": false, + "columns": [ + "family_id" + ], + "schemaTo": "trains", + "tableTo": "types", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "types_family_id_types_id_fkey", + "entityType": "fks", + "schema": "trains", + "table": "types" + }, + { + "nameExplicit": false, + "columns": [ + "artist_id" + ], + "schemaTo": "music", + "tableTo": "artists", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "albums_artist_id_artists_id_fkey", + "entityType": "fks", + "schema": "music", + "table": "albums" + }, + { + "nameExplicit": false, + "columns": [ + "artist_id" + ], + "schemaTo": "music", + "tableTo": "artists", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "artist_tag_fetch_artist_id_artists_id_fkey", + "entityType": "fks", + "schema": "music", + "table": "artist_tag_fetch" + }, + { + "nameExplicit": false, + "columns": [ + "artist_id" + ], + "schemaTo": "music", + "tableTo": "artists", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "artist_tags_artist_id_artists_id_fkey", + "entityType": "fks", + "schema": "music", + "table": "artist_tags" + }, + { + "nameExplicit": false, + "columns": [ + "track_id" + ], + "schemaTo": "music", + "tableTo": "tracks", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "now_playing_track_id_tracks_id_fkey", + "entityType": "fks", + "schema": "music", + "table": "now_playing" + }, + { + "nameExplicit": false, + "columns": [ + "track_id" + ], + "schemaTo": "music", + "tableTo": "tracks", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "plays_track_id_tracks_id_fkey", + "entityType": "fks", + "schema": "music", + "table": "plays" + }, + { + "nameExplicit": false, + "columns": [ + "track_id" + ], + "schemaTo": "music", + "tableTo": "tracks", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "track_artists_track_id_tracks_id_fkey", + "entityType": "fks", + "schema": "music", + "table": "track_artists" + }, + { + "nameExplicit": false, + "columns": [ + "artist_id" + ], + "schemaTo": "music", + "tableTo": "artists", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "track_artists_artist_id_artists_id_fkey", + "entityType": "fks", + "schema": "music", + "table": "track_artists" + }, + { + "nameExplicit": false, + "columns": [ + "album_id" + ], + "schemaTo": "music", + "tableTo": "albums", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "tracks_album_id_albums_id_fkey", + "entityType": "fks", + "schema": "music", + "table": "tracks" + }, + { + "nameExplicit": false, + "columns": [ + "artist_id" + ], + "schemaTo": "music", + "tableTo": "artists", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "tracks_artist_id_artists_id_fkey", + "entityType": "fks", + "schema": "music", + "table": "tracks" + }, + { + "nameExplicit": false, + "columns": [ + "device_id" + ], + "schemaTo": "hardware", + "tableTo": "devices", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "components_device_id_devices_id_fkey", + "entityType": "fks", + "schema": "hardware", + "table": "components" + }, + { + "nameExplicit": false, + "columns": [ + "replaces_id" + ], + "schemaTo": "hardware", + "tableTo": "components", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "components_replaces_id_components_id_fkey", + "entityType": "fks", + "schema": "hardware", + "table": "components" + }, + { + "nameExplicit": false, + "columns": [ + "mouse_id" + ], + "schemaTo": "hardware", + "tableTo": "components", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "SET NULL", + "name": "sensitivities_mouse_id_components_id_fkey", + "entityType": "fks", + "schema": "hardware", + "table": "sensitivities" + }, + { + "nameExplicit": false, + "columns": [ + "source_id" + ], + "schemaTo": "stats", + "tableTo": "source", + "columnsTo": [ + "source_id" + ], + "onUpdate": "NO ACTION", + "onDelete": "NO ACTION", + "name": "fetch_run_source_id_source_source_id_fkey", + "entityType": "fks", + "schema": "stats", + "table": "fetch_run" + }, + { + "nameExplicit": false, + "columns": [ + "series_id" + ], + "schemaTo": "stats", + "tableTo": "series", + "columnsTo": [ + "series_id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "obs_series_id_series_series_id_fkey", + "entityType": "fks", + "schema": "stats", + "table": "obs" + }, + { + "nameExplicit": false, + "columns": [ + "source_id" + ], + "schemaTo": "stats", + "tableTo": "source", + "columnsTo": [ + "source_id" + ], + "onUpdate": "NO ACTION", + "onDelete": "NO ACTION", + "name": "series_source_id_source_source_id_fkey", + "entityType": "fks", + "schema": "stats", + "table": "series" + }, + { + "nameExplicit": false, + "columns": [ + "region_code" + ], + "schemaTo": "stats", + "tableTo": "region", + "columnsTo": [ + "region_code" + ], + "onUpdate": "NO ACTION", + "onDelete": "NO ACTION", + "name": "series_region_code_region_region_code_fkey", + "entityType": "fks", + "schema": "stats", + "table": "series" + }, + { + "nameExplicit": false, + "columns": [ + "match_id" + ], + "schemaTo": "games", + "tableTo": "pubg_matches", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pubg_markers_match_id_pubg_matches_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pubg_markers" + }, + { + "nameExplicit": false, + "columns": [ + "room_id" + ], + "schemaTo": "games", + "tableTo": "pubg_rooms", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "pubg_matches_room_id_pubg_rooms_id_fkey", + "entityType": "fks", + "schema": "games", + "table": "pubg_matches" + }, + { + "nameExplicit": false, + "columns": [ + "title_id" + ], + "schemaTo": "movies", + "tableTo": "titles", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "episodes_title_id_titles_id_fkey", + "entityType": "fks", + "schema": "movies", + "table": "episodes" + }, + { + "nameExplicit": false, + "columns": [ + "title_id" + ], + "schemaTo": "movies", + "tableTo": "titles", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "plays_title_id_titles_id_fkey", + "entityType": "fks", + "schema": "movies", + "table": "plays" + }, + { + "nameExplicit": false, + "columns": [ + "episode_id" + ], + "schemaTo": "movies", + "tableTo": "episodes", + "columnsTo": [ + "id" + ], + "onUpdate": "NO ACTION", + "onDelete": "CASCADE", + "name": "plays_episode_id_episodes_id_fkey", + "entityType": "fks", + "schema": "movies", + "table": "plays" + }, + { + "columns": [ + "item_id", + "key" + ], + "nameExplicit": true, + "name": "item_dimensions_pkey", + "entityType": "pks", + "schema": "cs", + "table": "item_dimensions" + }, + { + "columns": [ + "source", + "currency", + "kind" + ], + "nameExplicit": true, + "name": "price_streams_pkey", + "entityType": "pks", + "schema": "cs", + "table": "price_streams" + }, + { + "columns": [ + "listing_id", + "observed_at" + ], + "nameExplicit": true, + "name": "price_history_pkey", + "entityType": "pks", + "schema": "house", + "table": "price_history" + }, + { + "columns": [ + "shelf_id", + "work_id" + ], + "nameExplicit": false, + "name": "shelf_works_pkey", + "entityType": "pks", + "schema": "books", + "table": "shelf_works" + }, + { + "columns": [ + "area", + "model_id" + ], + "nameExplicit": false, + "name": "activity_pkey", + "entityType": "pks", + "schema": "cars", + "table": "activity" + }, + { + "columns": [ + "area", + "type_id" + ], + "nameExplicit": false, + "name": "activity_pkey", + "entityType": "pks", + "schema": "planes", + "table": "activity" + }, + { + "columns": [ + "area", + "species_id" + ], + "nameExplicit": false, + "name": "activity_pkey", + "entityType": "pks", + "schema": "wildlife", + "table": "activity" + }, + { + "columns": [ + "area", + "type_id" + ], + "nameExplicit": false, + "name": "activity_pkey", + "entityType": "pks", + "schema": "trains", + "table": "activity" + }, + { + "columns": [ + "type_id", + "operator_id" + ], + "nameExplicit": false, + "name": "type_operators_pkey", + "entityType": "pks", + "schema": "trains", + "table": "type_operators" + }, + { + "columns": [ + "artist_id", + "tag" + ], + "nameExplicit": false, + "name": "artist_tags_pkey", + "entityType": "pks", + "schema": "music", + "table": "artist_tags" + }, + { + "columns": [ + "track_id", + "artist_id" + ], + "nameExplicit": false, + "name": "track_artists_pkey", + "entityType": "pks", + "schema": "music", + "table": "track_artists" + }, + { + "columns": [ + "ref_area", + "freq", + "period" + ], + "nameExplicit": false, + "name": "bis_policy_rate_pkey", + "entityType": "pks", + "schema": "stats", + "table": "bis_policy_rate" + }, + { + "columns": [ + "table_id", + "dimension", + "code" + ], + "nameExplicit": false, + "name": "cbs_code_pkey", + "entityType": "pks", + "schema": "stats", + "table": "cbs_code" + }, + { + "columns": [ + "table_id", + "obs_id" + ], + "nameExplicit": false, + "name": "cbs_obs_pkey", + "entityType": "pks", + "schema": "stats", + "table": "cbs_obs" + }, + { + "columns": [ + "period", + "item" + ], + "nameExplicit": false, + "name": "cw_cbcs_bop_pkey", + "entityType": "pks", + "schema": "stats", + "table": "cw_cbcs_bop" + }, + { + "columns": [ + "year", + "isic" + ], + "nameExplicit": false, + "name": "cw_cbs_gdp_industry_pkey", + "entityType": "pks", + "schema": "stats", + "table": "cw_cbs_gdp_industry" + }, + { + "columns": [ + "year", + "item_code" + ], + "nameExplicit": false, + "name": "cw_cbs_gov_finance_pkey", + "entityType": "pks", + "schema": "stats", + "table": "cw_cbs_gov_finance" + }, + { + "columns": [ + "year", + "sex", + "age_group", + "measure" + ], + "nameExplicit": false, + "name": "cw_cbs_lfs_pkey", + "entityType": "pks", + "schema": "stats", + "table": "cw_cbs_lfs" + }, + { + "columns": [ + "year", + "sex", + "age_group", + "kind" + ], + "nameExplicit": false, + "name": "cw_cbs_population_pkey", + "entityType": "pks", + "schema": "stats", + "table": "cw_cbs_population" + }, + { + "columns": [ + "period", + "measure", + "market" + ], + "nameExplicit": false, + "name": "cw_cbs_tourism_pkey", + "entityType": "pks", + "schema": "stats", + "table": "cw_cbs_tourism" + }, + { + "columns": [ + "wave", + "topic", + "item", + "country" + ], + "nameExplicit": false, + "name": "eb_item_pkey", + "entityType": "pks", + "schema": "stats", + "table": "eb_item" + }, + { + "columns": [ + "country", + "neighbour", + "ts" + ], + "nameExplicit": false, + "name": "ec_crossborder_pkey", + "entityType": "pks", + "schema": "stats", + "table": "ec_crossborder" + }, + { + "columns": [ + "bzn", + "ts" + ], + "nameExplicit": false, + "name": "ec_dayahead_price_pkey", + "entityType": "pks", + "schema": "stats", + "table": "ec_dayahead_price" + }, + { + "columns": [ + "election_id", + "level", + "area_code", + "party" + ], + "nameExplicit": false, + "name": "elec_result_pkey", + "entityType": "pks", + "schema": "stats", + "table": "elec_result" + }, + { + "columns": [ + "election_id", + "level", + "area_code" + ], + "nameExplicit": false, + "name": "elec_turnout_pkey", + "entityType": "pks", + "schema": "stats", + "table": "elec_turnout" + }, + { + "columns": [ + "snapshot", + "area", + "label" + ], + "nameExplicit": false, + "name": "ep_label_agg_pkey", + "entityType": "pks", + "schema": "stats", + "table": "ep_label_agg" + }, + { + "columns": [ + "dataset", + "key", + "period" + ], + "nameExplicit": false, + "name": "eurostat_obs_pkey", + "entityType": "pks", + "schema": "stats", + "table": "eurostat_obs" + }, + { + "columns": [ + "series_id", + "period" + ], + "nameExplicit": false, + "name": "fred_obs_pkey", + "entityType": "pks", + "schema": "stats", + "table": "fred_obs" + }, + { + "columns": [ + "date", + "country", + "theme" + ], + "nameExplicit": false, + "name": "gdelt_theme_vol_pkey", + "entityType": "pks", + "schema": "stats", + "table": "gdelt_theme_vol" + }, + { + "columns": [ + "geo", + "date", + "query" + ], + "nameExplicit": false, + "name": "gt_trending_pkey", + "entityType": "pks", + "schema": "stats", + "table": "gt_trending" + }, + { + "columns": [ + "place", + "slug" + ], + "nameExplicit": false, + "name": "hist_event_pkey", + "entityType": "pks", + "schema": "stats", + "table": "hist_event" + }, + { + "columns": [ + "place", + "slug" + ], + "nameExplicit": false, + "name": "hist_fact_pkey", + "entityType": "pks", + "schema": "stats", + "table": "hist_fact" + }, + { + "columns": [ + "place", + "date", + "name" + ], + "nameExplicit": false, + "name": "hist_holiday_pkey", + "entityType": "pks", + "schema": "stats", + "table": "hist_holiday" + }, + { + "columns": [ + "office_qid", + "person_qid", + "start_date" + ], + "nameExplicit": false, + "name": "hist_office_pkey", + "entityType": "pks", + "schema": "stats", + "table": "hist_office" + }, + { + "columns": [ + "place", + "person_qid" + ], + "nameExplicit": false, + "name": "hist_person_pkey", + "entityType": "pks", + "schema": "stats", + "table": "hist_person" + }, + { + "columns": [ + "vintage", + "indicator", + "country_iso3", + "year" + ], + "nameExplicit": false, + "name": "imf_weo_pkey", + "entityType": "pks", + "schema": "stats", + "table": "imf_weo" + }, + { + "columns": [ + "series_id", + "period" + ], + "nameExplicit": false, + "name": "obs_pkey", + "entityType": "pks", + "schema": "stats", + "table": "obs" + }, + { + "columns": [ + "series", + "poll_key", + "option" + ], + "nameExplicit": false, + "name": "op_poll_pkey", + "entityType": "pks", + "schema": "stats", + "table": "op_poll" + }, + { + "columns": [ + "page", + "revid" + ], + "nameExplicit": false, + "name": "op_wiki_snapshot_pkey", + "entityType": "pks", + "schema": "stats", + "table": "op_wiki_snapshot" + }, + { + "columns": [ + "country", + "year" + ], + "nameExplicit": false, + "name": "owid_energy_pkey", + "entityType": "pks", + "schema": "stats", + "table": "owid_energy" + }, + { + "columns": [ + "entity", + "year" + ], + "nameExplicit": false, + "name": "owid_maddison_pkey", + "entityType": "pks", + "schema": "stats", + "table": "owid_maddison" + }, + { + "columns": [ + "year", + "phase", + "row_key" + ], + "nameExplicit": false, + "name": "rf_budget_table_pkey", + "entityType": "pks", + "schema": "stats", + "table": "rf_budget_table" + }, + { + "columns": [ + "toptier_code", + "fiscal_year" + ], + "nameExplicit": false, + "name": "usas_agency_fy_pkey", + "entityType": "pks", + "schema": "stats", + "table": "usas_agency_fy" + }, + { + "columns": [ + "record_date", + "classification_id" + ], + "nameExplicit": false, + "name": "ust_mts_outlays_pkey", + "entityType": "pks", + "schema": "stats", + "table": "ust_mts_outlays" + }, + { + "columns": [ + "record_date", + "classification_id" + ], + "nameExplicit": false, + "name": "ust_mts_receipts_pkey", + "entityType": "pks", + "schema": "stats", + "table": "ust_mts_receipts" + }, + { + "columns": [ + "indicator_id", + "country_iso3", + "year" + ], + "nameExplicit": false, + "name": "wb_indicator_pkey", + "entityType": "pks", + "schema": "stats", + "table": "wb_indicator" + }, + { + "columns": [ + "year", + "country" + ], + "nameExplicit": false, + "name": "whr_score_pkey", + "entityType": "pks", + "schema": "stats", + "table": "whr_score" + }, + { + "columns": [ + "iso3", + "wave" + ], + "nameExplicit": false, + "name": "wo_cultural_map_pkey", + "entityType": "pks", + "schema": "stats", + "table": "wo_cultural_map" + }, + { + "columns": [ + "party_id", + "year", + "source", + "dim" + ], + "nameExplicit": false, + "name": "wo_party_position_pkey", + "entityType": "pks", + "schema": "stats", + "table": "wo_party_position" + }, + { + "columns": [ + "iso3", + "wave", + "item_code", + "stat" + ], + "nameExplicit": false, + "name": "wo_value_score_pkey", + "entityType": "pks", + "schema": "stats", + "table": "wo_value_score" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "account_pkey", + "schema": "auth", + "table": "account", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "session_pkey", + "schema": "auth", + "table": "session", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "user_pkey", + "schema": "auth", + "table": "user", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "verification_pkey", + "schema": "auth", + "table": "verification", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "blog_articles_pkey", + "schema": "site", + "table": "blog_articles", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tasks_pkey", + "schema": "site", + "table": "tasks", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "task_topics_pkey", + "schema": "site", + "table": "task_topics", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "topics_pkey", + "schema": "site", + "table": "topics", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "catch_em_all_settings_pkey", + "schema": "games", + "table": "catch_em_all_settings", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_games_pkey", + "schema": "ref", + "table": "pokemon_games", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_pkey", + "schema": "ref", + "table": "pokemon", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_encounters_pkey", + "schema": "ref", + "table": "pokemon_encounters", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_evolutions_pkey", + "schema": "ref", + "table": "pokemon_evolutions", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_game_entries_pkey", + "schema": "ref", + "table": "pokemon_game_entries", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_locations_pkey", + "schema": "ref", + "table": "pokemon_locations", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "catch_em_all_entries_pkey", + "schema": "games", + "table": "catch_em_all_entries", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "catch_em_all_games_pkey", + "schema": "games", + "table": "catch_em_all_games", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tracker_games_pkey", + "schema": "ref", + "table": "tracker_games", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tracker_items_pkey", + "schema": "ref", + "table": "tracker_items", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tracker_progress_pkey", + "schema": "games", + "table": "tracker_progress", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "library_pkey", + "schema": "games", + "table": "library", + "entityType": "pks" + }, + { + "columns": [ + "code" + ], + "nameExplicit": false, + "name": "cs2_share_codes_pkey", + "schema": "games", + "table": "cs2_share_codes", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "accounts_pkey", + "schema": "games", + "table": "accounts", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "match_players_pkey", + "schema": "games", + "table": "match_players", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "matches_pkey", + "schema": "games", + "table": "matches", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "seasons_pkey", + "schema": "games", + "table": "seasons", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "snapshots_pkey", + "schema": "games", + "table": "snapshots", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "osu_entries_pkey", + "schema": "games", + "table": "osu_entries", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_catches_pkey", + "schema": "games", + "table": "pokemon_catches", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_dex_numbers_pkey", + "schema": "ref", + "table": "pokemon_dex_numbers", + "entityType": "pks" + }, + { + "columns": [ + "game_id" + ], + "nameExplicit": false, + "name": "pokemon_game_research_pkey", + "schema": "ref", + "table": "pokemon_game_research", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_journeys_pkey", + "schema": "games", + "table": "pokemon_journeys", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_learnsets_pkey", + "schema": "ref", + "table": "pokemon_learnsets", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_milestones_pkey", + "schema": "games", + "table": "pokemon_milestones", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_moves_pkey", + "schema": "ref", + "table": "pokemon_moves", + "entityType": "pks" + }, + { + "columns": [ + "pokemon_id" + ], + "nameExplicit": false, + "name": "pokemon_research_pkey", + "schema": "ref", + "table": "pokemon_research", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pokemon_seen_pkey", + "schema": "games", + "table": "pokemon_seen", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tracker_challenge_progress_pkey", + "schema": "games", + "table": "tracker_challenge_progress", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tracker_challenges_pkey", + "schema": "ref", + "table": "tracker_challenges", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tracker_ranks_pkey", + "schema": "games", + "table": "tracker_ranks", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tracker_weapon_ranks_pkey", + "schema": "games", + "table": "tracker_weapon_ranks", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "animals_pkey", + "schema": "animaldex", + "table": "animals", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "sighting_photos_pkey", + "schema": "animaldex", + "table": "sighting_photos", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "sightings_pkey", + "schema": "animaldex", + "table": "sightings", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "columns_pkey", + "schema": "meta", + "table": "columns", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "edit_log_pkey", + "schema": "meta", + "table": "edit_log", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tables_pkey", + "schema": "meta", + "table": "tables", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "accounts_pkey", + "schema": "money", + "table": "accounts", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "bank_sessions_pkey", + "schema": "money", + "table": "bank_sessions", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "forecasts_pkey", + "schema": "money", + "table": "forecasts", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "insurances_pkey", + "schema": "money", + "table": "insurances", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "projection_settings_pkey", + "schema": "money", + "table": "projection_settings", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "recurring_pkey", + "schema": "money", + "table": "recurring", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "transactions_pkey", + "schema": "money", + "table": "transactions", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "utility_readings_pkey", + "schema": "money", + "table": "utility_readings", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "utility_settings_pkey", + "schema": "money", + "table": "utility_settings", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "wishlist_pkey", + "schema": "money", + "table": "wishlist", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "items_pkey", + "schema": "cs", + "table": "items", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "price_observations_pkey", + "schema": "cs", + "table": "price_observations", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "alert_rules_pkey", + "schema": "house", + "table": "alert_rules", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "listings_pkey", + "schema": "house", + "table": "listings", + "entityType": "pks" + }, + { + "columns": [ + "search_url" + ], + "nameExplicit": false, + "name": "searches_pkey", + "schema": "house", + "table": "searches", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "worker_runs_pkey", + "schema": "house", + "table": "worker_runs", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "appointments_pkey", + "schema": "health", + "table": "appointments", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "body_measurements_pkey", + "schema": "health", + "table": "body_measurements", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "medications_pkey", + "schema": "health", + "table": "medications", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "nutrition_daily_pkey", + "schema": "health", + "table": "nutrition_daily", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "sleep_pkey", + "schema": "health", + "table": "sleep", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "vaccinations_pkey", + "schema": "health", + "table": "vaccinations", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "workouts_pkey", + "schema": "health", + "table": "workouts", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "deleted_works_pkey", + "schema": "books", + "table": "deleted_works", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "files_pkey", + "schema": "books", + "table": "files", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "notes_pkey", + "schema": "books", + "table": "notes", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "progress_pkey", + "schema": "books", + "table": "progress", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "sessions_pkey", + "schema": "books", + "table": "sessions", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "shelves_pkey", + "schema": "books", + "table": "shelves", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "works_pkey", + "schema": "books", + "table": "works", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "activity_pkey", + "schema": "tasks", + "table": "activity", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "areas_pkey", + "schema": "tasks", + "table": "areas", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "goals_pkey", + "schema": "tasks", + "table": "goals", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tasks_pkey", + "schema": "tasks", + "table": "tasks", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "categories_pkey", + "schema": "groceries", + "table": "categories", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "groups_pkey", + "schema": "groceries", + "table": "groups", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "import_runs_pkey", + "schema": "groceries", + "table": "import_runs", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "item_prices_pkey", + "schema": "groceries", + "table": "item_prices", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "item_sizes_pkey", + "schema": "groceries", + "table": "item_sizes", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "items_pkey", + "schema": "groceries", + "table": "items", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "manual_prices_pkey", + "schema": "groceries", + "table": "manual_prices", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "stats_snapshots_pkey", + "schema": "groceries", + "table": "stats_snapshots", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "stores_pkey", + "schema": "groceries", + "table": "stores", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "synonyms_pkey", + "schema": "groceries", + "table": "synonyms", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "links_pkey", + "schema": "home", + "table": "links", + "entityType": "pks" + }, + { + "columns": [ + "key" + ], + "nameExplicit": false, + "name": "snapshots_pkey", + "schema": "home", + "table": "snapshots", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "brands_pkey", + "schema": "cars", + "table": "brands", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "models_pkey", + "schema": "cars", + "table": "models", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "photos_pkey", + "schema": "cars", + "table": "photos", + "entityType": "pks" + }, + { + "columns": [ + "model_id" + ], + "nameExplicit": false, + "name": "seen_pkey", + "schema": "cars", + "table": "seen", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "variants_pkey", + "schema": "cars", + "table": "variants", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "makers_pkey", + "schema": "planes", + "table": "makers", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "photos_pkey", + "schema": "planes", + "table": "photos", + "entityType": "pks" + }, + { + "columns": [ + "type_id" + ], + "nameExplicit": false, + "name": "seen_pkey", + "schema": "planes", + "table": "seen", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "types_pkey", + "schema": "planes", + "table": "types", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "groups_pkey", + "schema": "wildlife", + "table": "groups", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "photos_pkey", + "schema": "wildlife", + "table": "photos", + "entityType": "pks" + }, + { + "columns": [ + "species_id" + ], + "nameExplicit": false, + "name": "seen_pkey", + "schema": "wildlife", + "table": "seen", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "species_pkey", + "schema": "wildlife", + "table": "species", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "makers_pkey", + "schema": "trains", + "table": "makers", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "operators_pkey", + "schema": "trains", + "table": "operators", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "photos_pkey", + "schema": "trains", + "table": "photos", + "entityType": "pks" + }, + { + "columns": [ + "type_id" + ], + "nameExplicit": false, + "name": "seen_pkey", + "schema": "trains", + "table": "seen", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "types_pkey", + "schema": "trains", + "table": "types", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "albums_pkey", + "schema": "music", + "table": "albums", + "entityType": "pks" + }, + { + "columns": [ + "artist_id" + ], + "nameExplicit": false, + "name": "artist_tag_fetch_pkey", + "schema": "music", + "table": "artist_tag_fetch", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "artists_pkey", + "schema": "music", + "table": "artists", + "entityType": "pks" + }, + { + "columns": [ + "key" + ], + "nameExplicit": false, + "name": "import_state_pkey", + "schema": "music", + "table": "import_state", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "now_playing_pkey", + "schema": "music", + "table": "now_playing", + "entityType": "pks" + }, + { + "columns": [ + "key" + ], + "nameExplicit": false, + "name": "osu_match_cache_pkey", + "schema": "music", + "table": "osu_match_cache", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "plays_pkey", + "schema": "music", + "table": "plays", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "spotify_auth_pkey", + "schema": "music", + "table": "spotify_auth", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "tracks_pkey", + "schema": "music", + "table": "tracks", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "components_pkey", + "schema": "hardware", + "table": "components", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "devices_pkey", + "schema": "hardware", + "table": "devices", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "sensitivities_pkey", + "schema": "hardware", + "table": "sensitivities", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "setup_photos_pkey", + "schema": "hardware", + "table": "setup_photos", + "entityType": "pks" + }, + { + "columns": [ + "kind" + ], + "nameExplicit": false, + "name": "identity_pkey", + "schema": "dataholders", + "table": "identity", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "orgs_pkey", + "schema": "dataholders", + "table": "orgs", + "entityType": "pks" + }, + { + "columns": [ + "table_id" + ], + "nameExplicit": false, + "name": "cbs_table_pkey", + "schema": "stats", + "table": "cbs_table", + "entityType": "pks" + }, + { + "columns": [ + "period" + ], + "nameExplicit": false, + "name": "cw_cbs_cpi_pkey", + "schema": "stats", + "table": "cw_cbs_cpi", + "entityType": "pks" + }, + { + "columns": [ + "url" + ], + "nameExplicit": false, + "name": "cw_cbs_file_pkey", + "schema": "stats", + "table": "cw_cbs_file", + "entityType": "pks" + }, + { + "columns": [ + "election_id" + ], + "nameExplicit": false, + "name": "elec_election_pkey", + "schema": "stats", + "table": "elec_election", + "entityType": "pks" + }, + { + "columns": [ + "code" + ], + "nameExplicit": false, + "name": "eurostat_dataset_pkey", + "schema": "stats", + "table": "eurostat_dataset", + "entityType": "pks" + }, + { + "columns": [ + "run_id" + ], + "nameExplicit": false, + "name": "fetch_run_pkey", + "schema": "stats", + "table": "fetch_run", + "entityType": "pks" + }, + { + "columns": [ + "region_code" + ], + "nameExplicit": false, + "name": "region_pkey", + "schema": "stats", + "table": "region", + "entityType": "pks" + }, + { + "columns": [ + "series_id" + ], + "nameExplicit": false, + "name": "series_pkey", + "schema": "stats", + "table": "series", + "entityType": "pks" + }, + { + "columns": [ + "source_id" + ], + "nameExplicit": false, + "name": "source_pkey", + "schema": "stats", + "table": "source", + "entityType": "pks" + }, + { + "columns": [ + "id_no" + ], + "nameExplicit": false, + "name": "unesco_site_pkey", + "schema": "stats", + "table": "unesco_site", + "entityType": "pks" + }, + { + "columns": [ + "record_date" + ], + "nameExplicit": false, + "name": "ust_debt_daily_pkey", + "schema": "stats", + "table": "ust_debt_daily", + "entityType": "pks" + }, + { + "columns": [ + "party_id" + ], + "nameExplicit": false, + "name": "wo_compass_override_pkey", + "schema": "stats", + "table": "wo_compass_override", + "entityType": "pks" + }, + { + "columns": [ + "iso3" + ], + "nameExplicit": false, + "name": "wo_country_pkey", + "schema": "stats", + "table": "wo_country", + "entityType": "pks" + }, + { + "columns": [ + "sort" + ], + "nameExplicit": false, + "name": "wo_narrative_pkey", + "schema": "stats", + "table": "wo_narrative", + "entityType": "pks" + }, + { + "columns": [ + "party_id" + ], + "nameExplicit": false, + "name": "wo_party_pkey", + "schema": "stats", + "table": "wo_party", + "entityType": "pks" + }, + { + "columns": [ + "sort" + ], + "nameExplicit": false, + "name": "wo_source_pkey", + "schema": "stats", + "table": "wo_source", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pubg_markers_pkey", + "schema": "games", + "table": "pubg_markers", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pubg_matches_pkey", + "schema": "games", + "table": "pubg_matches", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "pubg_rooms_pkey", + "schema": "games", + "table": "pubg_rooms", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "bot_status_pkey", + "schema": "ai", + "table": "bot_status", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "news_items_pkey", + "schema": "ai", + "table": "news_items", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "usage_entries_pkey", + "schema": "ai", + "table": "usage_entries", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "episodes_pkey", + "schema": "movies", + "table": "episodes", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "plays_pkey", + "schema": "movies", + "table": "plays", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "recs_pkey", + "schema": "movies", + "table": "recs", + "entityType": "pks" + }, + { + "columns": [ + "key" + ], + "nameExplicit": false, + "name": "settings_pkey", + "schema": "movies", + "table": "settings", + "entityType": "pks" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "titles_pkey", + "schema": "movies", + "table": "titles", + "entityType": "pks" + }, + { + "nameExplicit": false, + "columns": [ + "slug" + ], + "nullsNotDistinct": false, + "name": "blog_articles_slug_unique", + "entityType": "uniques", + "schema": "site", + "table": "blog_articles" + }, + { + "nameExplicit": false, + "columns": [ + "task_id", + "topic_id" + ], + "nullsNotDistinct": false, + "name": "task_topics_task_id_topic_id_unique", + "entityType": "uniques", + "schema": "site", + "table": "task_topics" + }, + { + "nameExplicit": false, + "columns": [ + "from_pokemon_id", + "to_pokemon_id", + "game_id", + "method" + ], + "nullsNotDistinct": false, + "name": "pokemon_evolutions_from_pokemon_id_to_pokemon_id_game_id_method_unique", + "entityType": "uniques", + "schema": "ref", + "table": "pokemon_evolutions" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_id", + "game_id" + ], + "nullsNotDistinct": false, + "name": "pokemon_game_entries_pokemon_id_game_id_unique", + "entityType": "uniques", + "schema": "ref", + "table": "pokemon_game_entries" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_game_entry_id", + "user_id" + ], + "nullsNotDistinct": false, + "name": "catch_em_all_entries_pokemon_game_entry_id_user_id_unique", + "entityType": "uniques", + "schema": "games", + "table": "catch_em_all_entries" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "game_id" + ], + "nullsNotDistinct": false, + "name": "catch_em_all_games_user_id_game_id_unique", + "entityType": "uniques", + "schema": "games", + "table": "catch_em_all_games" + }, + { + "nameExplicit": false, + "columns": [ + "game_id", + "key" + ], + "nullsNotDistinct": false, + "name": "tracker_items_game_id_key_unique", + "entityType": "uniques", + "schema": "ref", + "table": "tracker_items" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "item_id", + "milestone" + ], + "nullsNotDistinct": false, + "name": "tracker_progress_user_id_item_id_milestone_unique", + "entityType": "uniques", + "schema": "games", + "table": "tracker_progress" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "game_id", + "party_slot" + ], + "nullsNotDistinct": false, + "name": "pokemon_catches_user_id_game_id_party_slot_unique", + "entityType": "uniques", + "schema": "games", + "table": "pokemon_catches" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_id", + "game_id", + "dex" + ], + "nullsNotDistinct": false, + "name": "pokemon_dex_numbers_pokemon_id_game_id_dex_unique", + "entityType": "uniques", + "schema": "ref", + "table": "pokemon_dex_numbers" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "game_id" + ], + "nullsNotDistinct": false, + "name": "pokemon_journeys_user_id_game_id_unique", + "entityType": "uniques", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "nameExplicit": false, + "columns": [ + "pokemon_id", + "version_group" + ], + "nullsNotDistinct": false, + "name": "pokemon_learnsets_pokemon_id_version_group_unique", + "entityType": "uniques", + "schema": "ref", + "table": "pokemon_learnsets" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "game_id", + "key" + ], + "nullsNotDistinct": false, + "name": "pokemon_milestones_user_id_game_id_key_unique", + "entityType": "uniques", + "schema": "games", + "table": "pokemon_milestones" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "game_id", + "pokemon_id" + ], + "nullsNotDistinct": false, + "name": "pokemon_seen_user_id_game_id_pokemon_id_unique", + "entityType": "uniques", + "schema": "games", + "table": "pokemon_seen" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "challenge_id" + ], + "nullsNotDistinct": false, + "name": "tracker_challenge_progress_user_id_challenge_id_unique", + "entityType": "uniques", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "nameExplicit": false, + "columns": [ + "game_id", + "key" + ], + "nullsNotDistinct": false, + "name": "tracker_challenges_game_id_key_unique", + "entityType": "uniques", + "schema": "ref", + "table": "tracker_challenges" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "game_id" + ], + "nullsNotDistinct": false, + "name": "tracker_ranks_user_id_game_id_unique", + "entityType": "uniques", + "schema": "games", + "table": "tracker_ranks" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "item_id" + ], + "nullsNotDistinct": false, + "name": "tracker_weapon_ranks_user_id_item_id_unique", + "entityType": "uniques", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "nameExplicit": true, + "columns": [ + "table_id", + "column_name" + ], + "nullsNotDistinct": false, + "name": "columns_table_id_column_name_key", + "entityType": "uniques", + "schema": "meta", + "table": "columns" + }, + { + "nameExplicit": true, + "columns": [ + "schema_name", + "table_name" + ], + "nullsNotDistinct": false, + "name": "tables_schema_name_table_name_key", + "entityType": "uniques", + "schema": "meta", + "table": "tables" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "name" + ], + "nullsNotDistinct": false, + "name": "accounts_user_id_name_unique", + "entityType": "uniques", + "schema": "money", + "table": "accounts" + }, + { + "nameExplicit": true, + "columns": [ + "external_uid" + ], + "nullsNotDistinct": false, + "name": "accounts_external_uid_key", + "entityType": "uniques", + "schema": "money", + "table": "accounts" + }, + { + "nameExplicit": true, + "columns": [ + "session_id" + ], + "nullsNotDistinct": false, + "name": "bank_sessions_session_id_key", + "entityType": "uniques", + "schema": "money", + "table": "bank_sessions" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "nullsNotDistinct": false, + "name": "projection_settings_user_id_unique", + "entityType": "uniques", + "schema": "money", + "table": "projection_settings" + }, + { + "nameExplicit": true, + "columns": [ + "account_id", + "external_id" + ], + "nullsNotDistinct": false, + "name": "transactions_account_external_id_key", + "entityType": "uniques", + "schema": "money", + "table": "transactions" + }, + { + "nameExplicit": false, + "columns": [ + "user_id", + "kind" + ], + "nullsNotDistinct": false, + "name": "utility_settings_user_id_kind_unique", + "entityType": "uniques", + "schema": "money", + "table": "utility_settings" + }, + { + "nameExplicit": true, + "columns": [ + "device_id", + "model", + "order_number" + ], + "nullsNotDistinct": true, + "name": "components_dedupe_uq", + "entityType": "uniques", + "schema": "hardware", + "table": "components" + }, + { + "nameExplicit": false, + "columns": [ + "token" + ], + "nullsNotDistinct": false, + "name": "session_token_key", + "schema": "auth", + "table": "session", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "email" + ], + "nullsNotDistinct": false, + "name": "user_email_key", + "schema": "auth", + "table": "user", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "user_id" + ], + "nullsNotDistinct": false, + "name": "catch_em_all_settings_user_id_key", + "schema": "games", + "table": "catch_em_all_settings", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "source_id" + ], + "nullsNotDistinct": false, + "name": "pokemon_games_source_id_key", + "schema": "ref", + "table": "pokemon_games", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "slug" + ], + "nullsNotDistinct": false, + "name": "pokemon_games_slug_key", + "schema": "ref", + "table": "pokemon_games", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "number" + ], + "nullsNotDistinct": false, + "name": "pokemon_number_key", + "schema": "ref", + "table": "pokemon", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "source_id" + ], + "nullsNotDistinct": false, + "name": "pokemon_locations_source_id_key", + "schema": "ref", + "table": "pokemon_locations", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "slug" + ], + "nullsNotDistinct": false, + "name": "tracker_games_slug_key", + "schema": "ref", + "table": "tracker_games", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "slug" + ], + "nullsNotDistinct": false, + "name": "library_slug_key", + "schema": "games", + "table": "library", + "entityType": "uniques" + }, + { + "nameExplicit": true, + "columns": [ + "slug" + ], + "nullsNotDistinct": false, + "name": "tables_slug_key", + "schema": "meta", + "table": "tables", + "entityType": "uniques" + }, + { + "nameExplicit": true, + "columns": [ + "date" + ], + "nullsNotDistinct": false, + "name": "nutrition_daily_date_key", + "schema": "health", + "table": "nutrition_daily", + "entityType": "uniques" + }, + { + "nameExplicit": true, + "columns": [ + "date" + ], + "nullsNotDistinct": false, + "name": "sleep_date_key", + "schema": "health", + "table": "sleep", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "slug" + ], + "nullsNotDistinct": false, + "name": "components_slug_key", + "schema": "hardware", + "table": "components", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "name" + ], + "nullsNotDistinct": false, + "name": "devices_name_key", + "schema": "hardware", + "table": "devices", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "game" + ], + "nullsNotDistinct": false, + "name": "sensitivities_game_key", + "schema": "hardware", + "table": "sensitivities", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "id" + ], + "nullsNotDistinct": false, + "name": "wo_country_id_key", + "schema": "stats", + "table": "wo_country", + "entityType": "uniques" + }, + { + "nameExplicit": false, + "columns": [ + "code" + ], + "nullsNotDistinct": false, + "name": "pubg_rooms_code_key", + "schema": "games", + "table": "pubg_rooms", + "entityType": "uniques" + }, + { + "value": "\"status\" IN ('main','active','occasional','unknown')", + "name": "library_status_check", + "entityType": "checks", + "schema": "games", + "table": "library" + }, + { + "value": "\"kind\" IN ('video','puzzle')", + "name": "library_kind_check", + "entityType": "checks", + "schema": "games", + "table": "library" + }, + { + "value": "(\"current_rank\" IS NULL OR \"current_rank\" > 0) AND (\"peak_rank\" IS NULL OR \"peak_rank\" > 0)", + "name": "library_rank_check", + "entityType": "checks", + "schema": "games", + "table": "library" + }, + { + "value": "\"kind\" IN ('score','goal','training')", + "name": "osu_entries_kind_check", + "entityType": "checks", + "schema": "games", + "table": "osu_entries" + }, + { + "value": "\"level\" between 1 and 100", + "name": "pokemon_catches_level_check", + "entityType": "checks", + "schema": "games", + "table": "pokemon_catches" + }, + { + "value": "\"party_slot\" between 1 and 6", + "name": "pokemon_catches_party_slot_check", + "entityType": "checks", + "schema": "games", + "table": "pokemon_catches" + }, + { + "value": "cardinality(\"moves\") <= 4", + "name": "pokemon_catches_moves_check", + "entityType": "checks", + "schema": "games", + "table": "pokemon_catches" + }, + { + "value": "\"stage\" IN ('story','postgame','collection')", + "name": "pokemon_catches_stage_check", + "entityType": "checks", + "schema": "games", + "table": "pokemon_catches" + }, + { + "value": "\"stage\" IN ('story','postgame','collection')", + "name": "pokemon_journeys_stage_check", + "entityType": "checks", + "schema": "games", + "table": "pokemon_journeys" + }, + { + "value": "\"current\" >= 0", + "name": "tracker_challenge_progress_current_check", + "entityType": "checks", + "schema": "games", + "table": "tracker_challenge_progress" + }, + { + "value": "\"level\" between 1 and 10000", + "name": "tracker_ranks_level_check", + "entityType": "checks", + "schema": "games", + "table": "tracker_ranks" + }, + { + "value": "\"prestige\" between 0 and 1000", + "name": "tracker_ranks_prestige_check", + "entityType": "checks", + "schema": "games", + "table": "tracker_ranks" + }, + { + "value": "\"level\" between 1 and 10000", + "name": "tracker_weapon_ranks_level_check", + "entityType": "checks", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "value": "\"prestige\" between 0 and 1000", + "name": "tracker_weapon_ranks_prestige_check", + "entityType": "checks", + "schema": "games", + "table": "tracker_weapon_ranks" + }, + { + "value": "ui_type IN ('text','longtext','url','image','number','cents','date','datetime','bool','select','multiselect','fk','json')", + "name": "columns_ui_type_check", + "entityType": "checks", + "schema": "meta", + "table": "columns" + }, + { + "value": "action IN ('insert','update','delete','import','add_column')", + "name": "edit_log_action_check", + "entityType": "checks", + "schema": "meta", + "table": "edit_log" + }, + { + "value": "slug ~ '^[a-z0-9][a-z0-9-]{0,62}$'", + "name": "tables_slug_check", + "entityType": "checks", + "schema": "meta", + "table": "tables" + }, + { + "value": "kind IN ('list','core','ref')", + "name": "tables_kind_check", + "entityType": "checks", + "schema": "meta", + "table": "tables" + }, + { + "value": "kind IN ('spendable','investment')", + "name": "accounts_kind_check", + "entityType": "checks", + "schema": "money", + "table": "accounts" + }, + { + "value": "scope IN ('personal','joint')", + "name": "accounts_scope_check", + "entityType": "checks", + "schema": "money", + "table": "accounts" + }, + { + "value": "provider IN ('manual','enablebanking')", + "name": "accounts_provider_check", + "entityType": "checks", + "schema": "money", + "table": "accounts" + }, + { + "value": "status IN ('authorized','expired','revoked','error')", + "name": "bank_sessions_status_check", + "entityType": "checks", + "schema": "money", + "table": "bank_sessions" + }, + { + "value": "cadence IN ('weekly','monthly','yearly')", + "name": "insurances_cadence_check", + "entityType": "checks", + "schema": "money", + "table": "insurances" + }, + { + "value": "contribution_mode IN ('excess','fixed')", + "name": "projection_settings_contribution_mode_check", + "entityType": "checks", + "schema": "money", + "table": "projection_settings" + }, + { + "value": "cadence IN ('weekly','monthly','yearly')", + "name": "recurring_cadence_check", + "entityType": "checks", + "schema": "money", + "table": "recurring" + }, + { + "value": "source IN ('manual','csv','enablebanking')", + "name": "transactions_source_check", + "entityType": "checks", + "schema": "money", + "table": "transactions" + }, + { + "value": "kind IN ('electricity','gas','water')", + "name": "utility_readings_kind_check", + "entityType": "checks", + "schema": "money", + "table": "utility_readings" + }, + { + "value": "kind IN ('electricity','gas','water')", + "name": "utility_settings_kind_check", + "entityType": "checks", + "schema": "money", + "table": "utility_settings" + }, + { + "value": "offer IN ('rent', 'buy')", + "name": "alert_rules_offer_check", + "entityType": "checks", + "schema": "house", + "table": "alert_rules" + }, + { + "value": "offer IN ('rent', 'buy')", + "name": "listings_offer_check", + "entityType": "checks", + "schema": "house", + "table": "listings" + }, + { + "value": "price_eur IS NULL OR price_eur >= 0", + "name": "listings_price_eur_check", + "entityType": "checks", + "schema": "house", + "table": "listings" + }, + { + "value": "contact_status IS NULL OR contact_status IN ('waiting_on_me', 'not_contacted', 'waiting_on_them', 'viewing', 'closed')", + "name": "listings_contact_status_check", + "entityType": "checks", + "schema": "house", + "table": "listings" + }, + { + "value": "contact_by IS NULL OR contact_by IN ('me', 'them')", + "name": "listings_contact_by_check", + "entityType": "checks", + "schema": "house", + "table": "listings" + }, + { + "value": "\"type\" IN ('appointment','checkup','condition','test','procedure','other')", + "name": "appointments_type_check", + "entityType": "checks", + "schema": "health", + "table": "appointments" + }, + { + "value": "\"date\" >= DATE '1900-01-01'", + "name": "appointments_date_check", + "entityType": "checks", + "schema": "health", + "table": "appointments" + }, + { + "value": "\"weight_kg\" IS NOT NULL OR \"waist_cm\" IS NOT NULL OR \"body_fat_pct\" IS NOT NULL", + "name": "body_measurements_any_check", + "entityType": "checks", + "schema": "health", + "table": "body_measurements" + }, + { + "value": "\"weight_kg\" IS NULL OR \"weight_kg\" BETWEEN 20 AND 400", + "name": "body_measurements_weight_check", + "entityType": "checks", + "schema": "health", + "table": "body_measurements" + }, + { + "value": "\"waist_cm\" IS NULL OR \"waist_cm\" BETWEEN 30 AND 250", + "name": "body_measurements_waist_check", + "entityType": "checks", + "schema": "health", + "table": "body_measurements" + }, + { + "value": "\"body_fat_pct\" IS NULL OR \"body_fat_pct\" BETWEEN 1 AND 75", + "name": "body_measurements_fat_check", + "entityType": "checks", + "schema": "health", + "table": "body_measurements" + }, + { + "value": "(\"muscle_mass_kg\" IS NULL OR \"muscle_mass_kg\" BETWEEN 5 AND 250)\n\t\t\tAND (\"skeletal_muscle_kg\" IS NULL OR \"skeletal_muscle_kg\" BETWEEN 5 AND 200)\n\t\t\tAND (\"bone_mass_kg\" IS NULL OR \"bone_mass_kg\" BETWEEN 0.5 AND 20)\n\t\t\tAND (\"visceral_fat\" IS NULL OR \"visceral_fat\" BETWEEN 1 AND 60)\n\t\t\tAND (\"body_water_pct\" IS NULL OR \"body_water_pct\" BETWEEN 20 AND 85)\n\t\t\tAND (\"protein_pct\" IS NULL OR \"protein_pct\" BETWEEN 5 AND 40)\n\t\t\tAND (\"bmr_kcal\" IS NULL OR \"bmr_kcal\" BETWEEN 500 AND 6000)\n\t\t\tAND (\"bmi\" IS NULL OR \"bmi\" BETWEEN 10 AND 80)", + "name": "body_measurements_scale_check", + "entityType": "checks", + "schema": "health", + "table": "body_measurements" + }, + { + "value": "\"date\" >= DATE '1900-01-01'", + "name": "body_measurements_date_check", + "entityType": "checks", + "schema": "health", + "table": "body_measurements" + }, + { + "value": "length(btrim(\"name\")) > 0", + "name": "medications_name_check", + "entityType": "checks", + "schema": "health", + "table": "medications" + }, + { + "value": "\"kind\" IN ('medication','supplement')", + "name": "medications_kind_check", + "entityType": "checks", + "schema": "health", + "table": "medications" + }, + { + "value": "\"stop_date\" IS NULL OR \"start_date\" IS NULL OR \"stop_date\" >= \"start_date\"", + "name": "medications_dates_check", + "entityType": "checks", + "schema": "health", + "table": "medications" + }, + { + "value": "\"kcal\" IS NULL OR \"kcal\" BETWEEN 0 AND 20000", + "name": "nutrition_daily_kcal_check", + "entityType": "checks", + "schema": "health", + "table": "nutrition_daily" + }, + { + "value": "\"protein_g\" IS NULL OR \"protein_g\" BETWEEN 0 AND 1000", + "name": "nutrition_daily_protein_check", + "entityType": "checks", + "schema": "health", + "table": "nutrition_daily" + }, + { + "value": "\"date\" >= DATE '1900-01-01'", + "name": "nutrition_daily_date_check", + "entityType": "checks", + "schema": "health", + "table": "nutrition_daily" + }, + { + "value": "\"wake_time\" > \"bedtime\"", + "name": "sleep_order_check", + "entityType": "checks", + "schema": "health", + "table": "sleep" + }, + { + "value": "\"wake_time\" - \"bedtime\" <= interval '24 hours'", + "name": "sleep_length_check", + "entityType": "checks", + "schema": "health", + "table": "sleep" + }, + { + "value": "\"date\" >= DATE '1900-01-01'", + "name": "sleep_date_check", + "entityType": "checks", + "schema": "health", + "table": "sleep" + }, + { + "value": "length(btrim(\"vaccine\")) > 0", + "name": "vaccinations_vaccine_check", + "entityType": "checks", + "schema": "health", + "table": "vaccinations" + }, + { + "value": "\"dose_no\" IS NULL OR \"dose_no\" BETWEEN 1 AND 20", + "name": "vaccinations_dose_no_check", + "entityType": "checks", + "schema": "health", + "table": "vaccinations" + }, + { + "value": "\"country\" IS NULL OR \"country\" ~ '^[A-Z]{2}$'", + "name": "vaccinations_country_check", + "entityType": "checks", + "schema": "health", + "table": "vaccinations" + }, + { + "value": "\"date\" >= DATE '1900-01-01'", + "name": "vaccinations_date_check", + "entityType": "checks", + "schema": "health", + "table": "vaccinations" + }, + { + "value": "length(btrim(\"exercise\")) > 0", + "name": "workouts_exercise_check", + "entityType": "checks", + "schema": "health", + "table": "workouts" + }, + { + "value": "\"sets\" IS NULL OR \"sets\" BETWEEN 1 AND 100", + "name": "workouts_sets_check", + "entityType": "checks", + "schema": "health", + "table": "workouts" + }, + { + "value": "\"reps\" IS NULL OR \"reps\" BETWEEN 0 AND 1000", + "name": "workouts_reps_check", + "entityType": "checks", + "schema": "health", + "table": "workouts" + }, + { + "value": "\"load_kg\" IS NULL OR \"load_kg\" BETWEEN 0 AND 1000", + "name": "workouts_load_check", + "entityType": "checks", + "schema": "health", + "table": "workouts" + }, + { + "value": "\"rpe\" IS NULL OR \"rpe\" BETWEEN 1 AND 10", + "name": "workouts_rpe_check", + "entityType": "checks", + "schema": "health", + "table": "workouts" + }, + { + "value": "\"date\" >= DATE '1900-01-01'", + "name": "workouts_date_check", + "entityType": "checks", + "schema": "health", + "table": "workouts" + }, + { + "value": "\"percent\" between 0 and 100", + "name": "progress_percent_check", + "entityType": "checks", + "schema": "books", + "table": "progress" + }, + { + "value": "\"rating\" is null or \"rating\" between 1 and 5", + "name": "progress_rating_check", + "entityType": "checks", + "schema": "books", + "table": "progress" + }, + { + "value": "(\"start_percent\" is null or \"start_percent\" between 0 and 100) and (\"end_percent\" is null or \"end_percent\" between 0 and 100)", + "name": "sessions_percent_check", + "entityType": "checks", + "schema": "books", + "table": "sessions" + }, + { + "value": "\"ended_at\" is null or \"ended_at\" >= \"started_at\"", + "name": "sessions_end_check", + "entityType": "checks", + "schema": "books", + "table": "sessions" + }, + { + "value": "\"year\" is null or \"year\" between 0 and 2100", + "name": "works_year_check", + "entityType": "checks", + "schema": "books", + "table": "works" + }, + { + "value": "\"task_id\" IS NOT NULL OR \"goal_id\" IS NOT NULL", + "name": "activity_target_check", + "entityType": "checks", + "schema": "tasks", + "table": "activity" + }, + { + "value": "\"kind\" IN ('created','status','edit','note','progress')", + "name": "activity_kind_check", + "entityType": "checks", + "schema": "tasks", + "table": "activity" + }, + { + "value": "\"slug\" ~ '^[a-z0-9][a-z0-9-]{0,62}$'", + "name": "areas_slug_check", + "entityType": "checks", + "schema": "tasks", + "table": "areas" + }, + { + "value": "length(btrim(\"name\")) > 0", + "name": "areas_name_check", + "entityType": "checks", + "schema": "tasks", + "table": "areas" + }, + { + "value": "length(btrim(\"title\")) > 0", + "name": "goals_title_check", + "entityType": "checks", + "schema": "tasks", + "table": "goals" + }, + { + "value": "\"status\" IN ('active','achieved','dropped')", + "name": "goals_status_check", + "entityType": "checks", + "schema": "tasks", + "table": "goals" + }, + { + "value": "length(btrim(\"title\")) > 0", + "name": "tasks_title_check", + "entityType": "checks", + "schema": "tasks", + "table": "tasks" + }, + { + "value": "\"status\" IN ('todo','in_progress','done','dropped')", + "name": "tasks_status_check", + "entityType": "checks", + "schema": "tasks", + "table": "tasks" + }, + { + "value": "\"priority\" BETWEEN 0 AND 3", + "name": "tasks_priority_check", + "entityType": "checks", + "schema": "tasks", + "table": "tasks" + }, + { + "value": "\"parent_id\" IS NULL OR \"parent_id\" <> \"id\"", + "name": "tasks_parent_check", + "entityType": "checks", + "schema": "tasks", + "table": "tasks" + }, + { + "value": "\"due_time\" IS NULL OR \"due_date\" IS NOT NULL", + "name": "tasks_time_check", + "entityType": "checks", + "schema": "tasks", + "table": "tasks" + }, + { + "value": "\"slug\" ~ '^[a-z0-9][a-z0-9-]{0,62}$'", + "name": "categories_slug_check", + "entityType": "checks", + "schema": "groceries", + "table": "categories" + }, + { + "value": "length(btrim(\"name\")) > 0", + "name": "categories_name_check", + "entityType": "checks", + "schema": "groceries", + "table": "categories" + }, + { + "value": "length(btrim(\"name\")) > 0", + "name": "groups_name_check", + "entityType": "checks", + "schema": "groceries", + "table": "groups" + }, + { + "value": "\"unit\" IS NULL OR \"unit\" IN ('piece','kg','l')", + "name": "groups_unit_check", + "entityType": "checks", + "schema": "groceries", + "table": "groups" + }, + { + "value": "\"merged_into_id\" IS NULL OR \"merged_into_id\" <> \"id\"", + "name": "groups_not_self_merged", + "entityType": "checks", + "schema": "groceries", + "table": "groups" + }, + { + "value": "\"unit\" IS NULL OR \"unit\" IN ('piece','kg','l')", + "name": "items_unit_check", + "entityType": "checks", + "schema": "groceries", + "table": "items" + }, + { + "value": "\"price_cents\" IS NULL OR \"price_cents\" >= 0", + "name": "items_price_check", + "entityType": "checks", + "schema": "groceries", + "table": "items" + }, + { + "value": "\"price_cents\" > 0 AND \"price_cents\" < 1000000", + "name": "manual_prices_price_check", + "entityType": "checks", + "schema": "groceries", + "table": "manual_prices" + }, + { + "value": "\"group_id\" IS NOT NULL OR \"item_id\" IS NOT NULL", + "name": "manual_prices_target_check", + "entityType": "checks", + "schema": "groceries", + "table": "manual_prices" + }, + { + "value": "\"unit\" IS NULL OR \"unit\" IN ('piece','kg','l')", + "name": "manual_prices_unit_check", + "entityType": "checks", + "schema": "groceries", + "table": "manual_prices" + }, + { + "value": "\"scope\" IN ('food','all')", + "name": "stats_snapshots_scope_check", + "entityType": "checks", + "schema": "groceries", + "table": "stats_snapshots" + }, + { + "value": "\"slug\" ~ '^[a-z0-9][a-z0-9-]{0,62}$'", + "name": "stores_slug_check", + "entityType": "checks", + "schema": "groceries", + "table": "stores" + }, + { + "value": "length(btrim(\"name\")) > 0", + "name": "stores_name_check", + "entityType": "checks", + "schema": "groceries", + "table": "stores" + }, + { + "value": "\"term\" ~ '^[a-z0-9][a-z0-9 -]{0,40}$'", + "name": "synonyms_term_check", + "entityType": "checks", + "schema": "groceries", + "table": "synonyms" + }, + { + "value": "\"synonym\" ~ '^[a-z0-9][a-z0-9 -]{0,40}$'", + "name": "synonyms_synonym_check", + "entityType": "checks", + "schema": "groceries", + "table": "synonyms" + }, + { + "value": "\"term\" <> \"synonym\"", + "name": "synonyms_not_self", + "entityType": "checks", + "schema": "groceries", + "table": "synonyms" + }, + { + "value": "length(btrim(\"title\")) between 1 and 80", + "name": "links_title_check", + "entityType": "checks", + "schema": "home", + "table": "links" + }, + { + "value": "\"url\" ~ '^https?://' and length(\"url\") <= 2000", + "name": "links_url_check", + "entityType": "checks", + "schema": "home", + "table": "links" + }, + { + "value": "\"id\" = 1", + "name": "now_playing_single_row", + "entityType": "checks", + "schema": "music", + "table": "now_playing" + }, + { + "value": "\"source\" in ('spotify', 'lastfm', 'youtube', 'local')", + "name": "plays_source_check", + "entityType": "checks", + "schema": "music", + "table": "plays" + }, + { + "value": "\"origin\" in ('api', 'export', 'import', 'manual', 'nowplaying')", + "name": "plays_origin_check", + "entityType": "checks", + "schema": "music", + "table": "plays" + }, + { + "value": "\"id\" = 1", + "name": "spotify_auth_single_row", + "entityType": "checks", + "schema": "music", + "table": "spotify_auth" + }, + { + "value": "category in ('case', 'cpu', 'motherboard', 'ram', 'cpu_cooler', 'gpu', 'psu', 'storage', 'fan', 'lighting', 'monitor', 'mouse', 'keyboard', 'headset', 'audio', 'controller', 'accessory', 'microphone', 'mousepad', 'webcam', 'chair', 'other')", + "name": "components_category_check", + "entityType": "checks", + "schema": "hardware", + "table": "components" + }, + { + "value": "status in ('in_use', 'planned', 'spare', 'retired', 'sold')", + "name": "components_status_check", + "entityType": "checks", + "schema": "hardware", + "table": "components" + }, + { + "value": "quantity > 0", + "name": "components_quantity_check", + "entityType": "checks", + "schema": "hardware", + "table": "components" + }, + { + "value": "section is null or section in ('pc', 'desk', 'audio', 'sim')", + "name": "components_section_check", + "entityType": "checks", + "schema": "hardware", + "table": "components" + }, + { + "value": "usage is null or usage in ('current', 'stored', 'previous', 'work-issued', 'placeholder', 'planned', 'legacy', 'legacy-previous')", + "name": "components_usage_check", + "entityType": "checks", + "schema": "hardware", + "table": "components" + }, + { + "value": "removed_at is null or installed_at is null or removed_at >= installed_at", + "name": "components_dates_check", + "entityType": "checks", + "schema": "hardware", + "table": "components" + }, + { + "value": "unit_price_cents >= 0", + "name": "components_unit_price_cents_check", + "entityType": "checks", + "schema": "hardware", + "table": "components" + }, + { + "value": "total_price_cents >= 0", + "name": "components_total_price_cents_check", + "entityType": "checks", + "schema": "hardware", + "table": "components" + }, + { + "value": "(dpi is null or dpi > 0) and (measured_dpi is null or measured_dpi > 0)", + "name": "components_dpi_check", + "entityType": "checks", + "schema": "hardware", + "table": "components" + }, + { + "value": "kind in ('desktop', 'laptop', 'server', 'vm', 'phone', 'tablet', 'monitor', 'other')", + "name": "devices_kind_check", + "entityType": "checks", + "schema": "hardware", + "table": "devices" + }, + { + "value": "status in ('active', 'spare', 'planned', 'retired', 'sold')", + "name": "devices_status_check", + "entityType": "checks", + "schema": "hardware", + "table": "devices" + }, + { + "value": "(price_cents is null or price_cents >= 0) and (monthly_cents is null or monthly_cents >= 0) and (budget_cents is null or budget_cents >= 0)", + "name": "devices_cents_check", + "entityType": "checks", + "schema": "hardware", + "table": "devices" + }, + { + "value": "cm_per_360 is null or cm_per_360 > 0", + "name": "sensitivities_cm_check", + "entityType": "checks", + "schema": "hardware", + "table": "sensitivities" + }, + { + "value": "yaw is null or yaw > 0", + "name": "sensitivities_yaw_check", + "entityType": "checks", + "schema": "hardware", + "table": "sensitivities" + }, + { + "value": "\"kind\" IN ('address','email','phone','iban')", + "name": "identity_kind_check", + "entityType": "checks", + "schema": "dataholders", + "table": "identity" + }, + { + "value": "length(btrim(\"name\")) > 0", + "name": "orgs_name_check", + "entityType": "checks", + "schema": "dataholders", + "table": "orgs" + }, + { + "value": "\"address_status\" IN ('confirmed','likely','unknown')", + "name": "orgs_address_status_check", + "entityType": "checks", + "schema": "dataholders", + "table": "orgs" + }, + { + "value": "\"action\" IN ('update','close','check','none')", + "name": "orgs_action_check", + "entityType": "checks", + "schema": "dataholders", + "table": "orgs" + }, + { + "value": "\"priority\" IN ('must','should','nice')", + "name": "orgs_priority_check", + "entityType": "checks", + "schema": "dataholders", + "table": "orgs" + }, + { + "value": "length(btrim(\"name\")) > 0", + "name": "bot_status_name_check", + "entityType": "checks", + "schema": "ai", + "table": "bot_status" + }, + { + "value": "\"section\" IN ('ai','software')", + "name": "news_items_section_check", + "entityType": "checks", + "schema": "ai", + "table": "news_items" + }, + { + "value": "length(btrim(\"title\")) > 0", + "name": "news_items_title_check", + "entityType": "checks", + "schema": "ai", + "table": "news_items" + }, + { + "value": "\"provider\" IN ('claude','chatgpt','gemini','api')", + "name": "usage_entries_provider_check", + "entityType": "checks", + "schema": "ai", + "table": "usage_entries" + }, + { + "value": "\"source\" IN ('scheduled','ccusage','export','manual')", + "name": "usage_entries_source_check", + "entityType": "checks", + "schema": "ai", + "table": "usage_entries" + }, + { + "value": "length(btrim(\"metric\")) > 0", + "name": "usage_entries_metric_check", + "entityType": "checks", + "schema": "ai", + "table": "usage_entries" + }, + { + "value": "\"who\" IN ('stan','juhee','both')", + "name": "plays_who_check", + "entityType": "checks", + "schema": "movies", + "table": "plays" + }, + { + "value": "\"platform\" IS NULL OR \"platform\" IN ('netflix','plex','cinema','other')", + "name": "plays_platform_check", + "entityType": "checks", + "schema": "movies", + "table": "plays" + }, + { + "value": "\"type\" IN ('movie','show')", + "name": "recs_type_check", + "entityType": "checks", + "schema": "movies", + "table": "recs" + }, + { + "value": "\"for_whom\" IN ('stan','juhee','both')", + "name": "recs_for_check", + "entityType": "checks", + "schema": "movies", + "table": "recs" + }, + { + "value": "length(btrim(\"title\")) > 0", + "name": "recs_title_check", + "entityType": "checks", + "schema": "movies", + "table": "recs" + }, + { + "value": "\"key\" IN ('visibility')", + "name": "settings_key_check", + "entityType": "checks", + "schema": "movies", + "table": "settings" + }, + { + "value": "\"type\" IN ('movie','show')", + "name": "titles_type_check", + "entityType": "checks", + "schema": "movies", + "table": "titles" + }, + { + "value": "\"status\" IN ('watching','watched','watchlist','dropped')", + "name": "titles_status_check", + "entityType": "checks", + "schema": "movies", + "table": "titles" + }, + { + "value": "\"rating\" IS NULL OR (\"rating\" >= 0.5 AND \"rating\" <= 5 AND \"rating\" * 2 = round(\"rating\" * 2))", + "name": "titles_rating_check", + "entityType": "checks", + "schema": "movies", + "table": "titles" + }, + { + "value": "\"rewatch_count\" >= 0", + "name": "titles_rewatch_check", + "entityType": "checks", + "schema": "movies", + "table": "titles" + }, + { + "value": "\"watched_by\" IS NULL OR \"watched_by\" IN ('stan','juhee','both')", + "name": "titles_who_check", + "entityType": "checks", + "schema": "movies", + "table": "titles" + }, + { + "value": "\"platform\" IS NULL OR \"platform\" IN ('netflix','plex','cinema','other')", + "name": "titles_platform_check", + "entityType": "checks", + "schema": "movies", + "table": "titles" + }, + { + "value": "\"source\" IN ('netflix','plex','letterboxd','manual','ju','site')", + "name": "titles_source_check", + "entityType": "checks", + "schema": "movies", + "table": "titles" + }, + { + "value": "\"match_status\" IN ('pending','matched','manual','not_found')", + "name": "titles_match_check", + "entityType": "checks", + "schema": "movies", + "table": "titles" + }, + { + "value": "length(btrim(\"title\")) > 0", + "name": "titles_title_check", + "entityType": "checks", + "schema": "movies", + "table": "titles" + } + ], + "renames": [] +} \ No newline at end of file diff --git a/scripts/deploy-preflight.ts b/scripts/deploy-preflight.ts index 33d7777..726918e 100644 --- a/scripts/deploy-preflight.ts +++ b/scripts/deploy-preflight.ts @@ -211,6 +211,30 @@ try { ai.public_usage ) throw new Error(`ai schema tables/grants are wrong: ${JSON.stringify(ai)}`); + // Movies & TV tracker (public pages, owner-only edits in the app): app role read/write, + // personal_ro none. 5 = titles, episodes, plays, recs, settings. + const MOVIES_TABLES = 5; + const [movies] = await client` + select + count(*) filter (where has_table_privilege(c.oid, 'select, insert, update, delete')) as app_rw, + count(*) filter ( + where exists ( + select 1 from aclexplode(c.relacl) a join pg_roles r on r.oid = a.grantee + where r.rolname = 'personal_ro' + ) + ) as ro_read, + count(*) as tables, + has_schema_privilege('public', 'movies', 'usage') as public_usage + from pg_class c join pg_namespace n on n.oid = c.relnamespace + where n.nspname = 'movies' and c.relkind = 'r' + `; + if ( + Number(movies.tables) !== MOVIES_TABLES || + Number(movies.app_rw) !== MOVIES_TABLES || + Number(movies.ro_read) !== 0 || + movies.public_usage + ) + throw new Error(`movies schema tables/grants are wrong: ${JSON.stringify(movies)}`); // Energy tracker reads the ned-collector tables (SELECT only). const [energy] = await client` select count(*) as hours, max(valid_from) as latest from energy.ned_utilization @@ -220,7 +244,7 @@ try { if (!Number(energy.hours)) console.warn('Warning: energy.ned_utilization has no hourly data from the last 7 days'); console.log( - `health: ${health.tables} tables, tasks: ${tasks.tables} tables, groceries: ${groceries.tables} tables, stats: ${stats.tables} tables, ai: ${ai.tables} tables, app read/write, personal_ro none; energy: ${energy.hours} hourly rows, latest ${energy.latest ? new Date(energy.latest).toISOString() : 'none'}` + `health: ${health.tables} tables, tasks: ${tasks.tables} tables, groceries: ${groceries.tables} tables, stats: ${stats.tables} tables, ai: ${ai.tables} tables, movies: ${movies.tables} tables, app read/write, personal_ro none; energy: ${energy.hours} hourly rows, latest ${energy.latest ? new Date(energy.latest).toISOString() : 'none'}` ); const [catalog] = await client` select diff --git a/scripts/movies-import.ts b/scripts/movies-import.ts new file mode 100644 index 0000000..ae3dfa6 --- /dev/null +++ b/scripts/movies-import.ts @@ -0,0 +1,200 @@ +/** + * Import watch history into the movies & TV tracker (movies schema, /trackers/movies). + * Idempotent: re-running a file adds nothing new. Plays are keyed by source (source_key), titles + * by (type, tmdb_id) or normalised title + year, episodes by season + number (or name). Titles are + * deduped across sources by TMDB id: when TMDB_API_KEY is set, the import ends with a matching + * pass (scripts/movies-tmdb.ts) that merges rows resolving to the same TMDB title. + * + * On stan-ovh (DB_URL and the TMDB key are loaded for you, nothing printed): + * scripts/movies-run.sh import --netflix ~/imports/ViewingActivity.csv --profile-map "Stan=stan,Juhee=juhee" + * scripts/movies-run.sh import --netflix ~/imports/NetflixViewingHistory.csv --who both + * scripts/movies-run.sh import --letterboxd ~/imports/letterboxd-export.zip + * scripts/movies-run.sh import --plex ~/imports/tautulli-history.json --user-map "stan=stan,juhee=juhee" + * scripts/movies-run.sh import --json ~/imports/ju-movies.json + * Add --dry-run to parse and print a summary without touching the database. + * + * --netflix + * ViewingActivity.csv (netflix.com/account/getmyinfo → CONTENT_INTERACTION/ViewingActivity.csv): + * Profile Name,Start Time,Duration,Attributes,Title,Supplemental Video Type,Device Type,… + * Start Time is UTC ("2024-01-31 20:15:00"), Duration "HH:MM:SS". Trailers/hooks (any + * Supplemental Video Type) are skipped; sessions of the same title on the same Amsterdam day are + * summed into one play and dropped when under --min-minutes (default 5). + * --profile-map "Profile=stan|juhee|both,…" (unmapped profiles use --who), --profiles "Stan,Juhee" + * to import only those profiles. + * NetflixViewingHistory.csv (account → Viewing activity → Download all): Title,Date. Dates may be + * ISO, D-M-YYYY (Dutch site) or slash dates; D/M vs M/D is guessed from the file, else + * --date-order dmy|mdy (default dmy). All rows count for --who (default stan). + * Titles: "Show: Season 2: Episode" (also Seizoen/Part/Limited Series/…) become show episodes + * (season number + name; scripts/movies-tmdb.ts fills episode numbers from TMDB). A title whose + * first ": " segment appears with 3+ different endings in the file is a show too; everything + * else is a movie. Platform netflix. + * + * --letterboxd + * The Letterboxd export zip (Settings → Data → Export), its unzipped folder, or one of its CSVs. + * diary.csv: one play per entry on its Watched Date (rating from the entry); ratings.csv: + * rating; watched.csv: status watched (no play, its date is the logging date); watchlist.csv: + * status watchlist. All movies, who = --who (default stan), platform --platform (default none). + * + * --plex (assumptions: Plex has no official history export, so this reads) + * - Tautulli get_history JSON ({"response":{"data":{"data":[…]}}} or a plain array) or a CSV with + * the same column names: media_type (movie|episode; others skipped), title, year, + * grandparent_title (show), parent_media_index (season), media_index (episode), started or date + * (epoch seconds), play_duration or duration (seconds), friendly_name or user, percent_complete + * (plays under --min-percent, default 50, skipped), id/row_id (play id), rating_key, guids. + * - Plex Media Server /status/sessions/history/all as JSON ({"MediaContainer":{"Metadata":[…]}}): + * type, title, grandparentTitle, parentIndex, index, viewedAt, accountID, historyKey. + * A tmdb:// or themoviedb:// guid gives the TMDB id directly. --user-map "name=who,…" maps + * Plex/Tautulli users (unmapped → --who), --users "a,b" imports only those. Platform plex. + * + * --json manual entries (Ju or Daisy). An array of: + * { + * "type": "movie" | "show", // "tv" is accepted as "show" + * "title": "Past Lives", "year": 2023, // year optional + * "tmdb_id": 666277, // optional; skips matching when given + * "status": "watched", // watching | watched | watchlist | dropped (optional) + * "rating": 4.5, // 0.5–5 in steps of 0.5 (optional) + * "rewatch_count": 1, "first_watched": "2023-09-01", "last_watched": "2024-02-11", + * "who": "both", // stan | juhee | both (default stan for plays) + * "platform": "cinema", // netflix | plex | cinema | other + * "notes": "…", "source": "ju", // "manual" (default) or "ju" + * "watched_on": ["2023-09-01"], // movie plays, one per date + * "episodes": [{ "season": 1, "episode": 3, "name": "…", "watched_on": "2024-01-02" }] + * } + * Fields given here overwrite the stored ones; omitted fields are left alone. + * + * Uses DB_URL (app role). TMDB_API_KEY is optional; without it everything imports unmatched + * (no posters) and a later `scripts/movies-run.sh tmdb` matches it. --no-tmdb skips the pass. + */ +import { readFile, readdir, stat } from 'node:fs/promises'; +import { execFileSync } from 'node:child_process'; +import { join } from 'node:path'; +import postgres from 'postgres'; +import { + fromManual, + manualFile, + parseLetterboxd, + parseNetflix, + parsePlex, + parseWhoMap, + plexRows, + normTitle, + type ImportItem +} from '../src/lib/server/movies/parse'; +import { importItems } from '../src/lib/server/movies/store'; +import { Tmdb, runTmdb } from '../src/lib/server/movies/tmdb'; +import { + MOVIE_PLATFORMS, + MOVIE_WHO, + type MoviePlatform, + type MovieWho +} from '../src/lib/server/db/schema/movies'; + +const argv = process.argv.slice(2); +const flag = (name: string) => argv.includes(`--${name}`); +const opt = (name: string) => { + const i = argv.indexOf(`--${name}`); + return i >= 0 ? argv[i + 1] : undefined; +}; +const usage = () => { + console.error( + 'usage: bun scripts/movies-import.ts (--netflix | --letterboxd | --plex | --json ) [--dry-run] [--no-tmdb] [--who stan|juhee|both] …' + ); + process.exit(2); +}; +const who = (opt('who') ?? 'stan') as MovieWho; +if (!MOVIE_WHO.includes(who)) usage(); +const platform = opt('platform') as MoviePlatform | undefined; +if (platform && !MOVIE_PLATFORMS.includes(platform)) usage(); +const list = (s?: string) => + new Set( + (s ?? '') + .split(',') + .map((x) => normTitle(x)) + .filter(Boolean) + ); + +let items: ImportItem[] = []; +let skipped = 0; +if (opt('netflix')) { + const order = opt('date-order'); + if (order && order !== 'dmy' && order !== 'mdy') usage(); + const r = parseNetflix(await readFile(opt('netflix')!, 'utf8'), { + who, + profiles: parseWhoMap(opt('profile-map')), + onlyProfiles: list(opt('profiles')), + dateOrder: order as 'dmy' | 'mdy' | undefined, + minMinutes: opt('min-minutes') ? Number(opt('min-minutes')) : undefined + }); + items = r.items; + skipped = r.skipped; +} else if (opt('letterboxd')) { + const path = opt('letterboxd')!; + const files: Record = {}; + if ((await stat(path)).isDirectory()) { + for (const f of await readdir(path)) + if (f.endsWith('.csv')) files[f] = await readFile(join(path, f), 'utf8'); + } else if (path.toLowerCase().endsWith('.zip')) { + const names = execFileSync('unzip', ['-Z1', path], { encoding: 'utf8' }) + .split('\n') + .filter((n) => /(^|\/)[a-z]+\.csv$/i.test(n) && !n.includes('deleted/')); + for (const n of names) + files[n] = execFileSync('unzip', ['-p', path, n], { encoding: 'utf8', maxBuffer: 64 << 20 }); + } else files[path] = await readFile(path, 'utf8'); + items = parseLetterboxd(files, { who, platform: platform ?? null }); +} else if (opt('plex')) { + const path = opt('plex')!; + const r = parsePlex( + plexRows(await readFile(path, 'utf8'), path.toLowerCase().endsWith('.csv') ? 'csv' : 'json'), + { + who, + users: parseWhoMap(opt('user-map')), + onlyUsers: list(opt('users')), + minPercent: opt('min-percent') ? Number(opt('min-percent')) : undefined + } + ); + items = r.items; + skipped = r.skipped; +} else if (opt('json')) { + const parsed = manualFile.safeParse(JSON.parse(await readFile(opt('json')!, 'utf8'))); + if (!parsed.success) { + for (const issue of parsed.error.issues.slice(0, 50)) + console.error(`${issue.path.join('.')}: ${issue.message}`); + process.exit(1); + } + items = parsed.data.map(fromManual); +} else usage(); + +const movies = items.filter((i) => i.type === 'movie').length; +const plays = items.reduce((n, i) => n + i.plays.length, 0); +console.log( + `Parsed ${items.length} titles (${movies} movies, ${items.length - movies} shows), ${plays} plays, ${skipped} rows skipped` +); +if (flag('dry-run')) { + for (const i of items.slice(0, 15)) + console.log( + ` ${i.type.padEnd(5)} ${i.title}${i.year ? ` (${i.year})` : ''}: ${i.plays.length} plays${i.episodes?.length ? `, ${i.episodes.length} episodes` : ''}` + ); + process.exit(0); +} +if (!process.env.DB_URL) + throw new Error('DB_URL is required (use scripts/movies-run.sh on stan-ovh)'); +const sql = postgres(process.env.DB_URL, { max: 1, onnotice: () => {} }); +try { + const s = await importItems(sql, items); + console.log( + `Imported: ${s.titles} titles (${s.newTitles} new), ${s.newPlays} new plays of ${s.plays}, ${s.episodes} episodes seen` + ); + if (process.env.TMDB_API_KEY && !flag('no-tmdb')) { + const m = await runTmdb(sql, new Tmdb(process.env.TMDB_API_KEY), { + log: (l) => console.log(` ${l}`) + }); + console.log( + `TMDB: ${m.matched} matched, ${m.merged} merged, ${m.notFound} not found, ${m.refreshed} refreshed, ${m.errors} errors` + ); + } else if (!process.env.TMDB_API_KEY) + console.log( + 'No TMDB_API_KEY: titles stay unmatched (no posters) until scripts/movies-run.sh tmdb runs with a key' + ); +} finally { + await sql.end(); +} diff --git a/scripts/movies-recs-import.ts b/scripts/movies-recs-import.ts new file mode 100644 index 0000000..df5e397 --- /dev/null +++ b/scripts/movies-recs-import.ts @@ -0,0 +1,47 @@ +/** + * Import Ju's recommendations into movies.recs (the "Ju recommends" feed on /trackers/movies). + * Idempotent: upserts on (type, tmdb_id); title, for, reason and added_at are overwritten. + * + * scripts/movies-run.sh recs ~/imports/ju-recs.json # upsert + * scripts/movies-run.sh recs ~/imports/ju-recs.json --prune # also delete recs not in the file + * bun scripts/movies-recs-import.ts --dry-run ju-recs.json # validate only (no DB) + * + * JSON: an array of + * { "tmdb_id": 496243, "type": "movie", "title": "Parasite", "for": "both", + * "reason": "one line on why", "added_at": "2026-10-26T10:00:00+01:00" } + * type: movie | show ("tv" accepted); for: stan | juhee | both; reason and added_at optional + * (added_at defaults to now). Posters and year come from TMDB when TMDB_API_KEY is set. + */ +import { readFile } from 'node:fs/promises'; +import postgres from 'postgres'; +import { recsFile } from '../src/lib/server/movies/parse'; +import { upsertRecs } from '../src/lib/server/movies/store'; +import { Tmdb, runTmdb } from '../src/lib/server/movies/tmdb'; + +const args = process.argv.slice(2); +const files = args.filter((a) => !a.startsWith('--')); +if (files.length !== 1) { + console.error('usage: bun scripts/movies-recs-import.ts [--dry-run] [--prune] '); + process.exit(2); +} +const parsed = recsFile.safeParse(JSON.parse(await readFile(files[0], 'utf8'))); +if (!parsed.success) { + for (const issue of parsed.error.issues.slice(0, 50)) + console.error(`${issue.path.join('.')}: ${issue.message}`); + process.exit(1); +} +console.log(`Valid: ${parsed.data.length} recommendations`); +if (args.includes('--dry-run')) process.exit(0); +if (!process.env.DB_URL) + throw new Error('DB_URL is required (use scripts/movies-run.sh on stan-ovh)'); +const sql = postgres(process.env.DB_URL, { max: 1, onnotice: () => {} }); +try { + const r = await upsertRecs(sql, parsed.data, args.includes('--prune')); + console.log(`Upserted ${r.upserted} recommendations${r.pruned ? `, pruned ${r.pruned}` : ''}`); + if (process.env.TMDB_API_KEY) { + const m = await runTmdb(sql, new Tmdb(process.env.TMDB_API_KEY), { limit: 0 }); + console.log(`TMDB: ${m.errors} errors`); + } +} finally { + await sql.end(); +} diff --git a/scripts/movies-run.sh b/scripts/movies-run.sh new file mode 100755 index 0000000..858fa3e --- /dev/null +++ b/scripts/movies-run.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +# Run a movies tracker script on stan-ovh against prod, without printing secrets. +# scripts/movies-run.sh import --netflix ~/imports/ViewingActivity.csv [--dry-run] … +# scripts/movies-run.sh recs ~/imports/ju-recs.json [--prune] +# scripts/movies-run.sh tmdb [--retry-not-found] +# DB_URL (app role) comes from the running app container (db:5432 → 127.0.0.1:5440). +# TMDB_API_KEY comes from ~/.config/movies/tmdb.env (mode 600, one line TMDB_API_KEY=…), if present. +# Runs from this checkout; use a checkout of main (e.g. ~/dev/personal-website after a pull). +set -euo pipefail +cd "$(dirname "$0")/.." +cmd=${1:?usage: movies-run.sh import|recs|tmdb [args]} +shift +case "$cmd" in + import) script=scripts/movies-import.ts ;; + recs) script=scripts/movies-recs-import.ts ;; + tmdb) script=scripts/movies-tmdb.ts ;; + *) echo "unknown command $cmd (import, recs or tmdb)" >&2; exit 2 ;; +esac +DB_URL=$(sudo -n docker inspect personal-website-app-1 --format '{{range .Config.Env}}{{println .}}{{end}}' \ + | sed -n 's/^DB_URL=//p' | sed 's/@db:5432/@127.0.0.1:5440/') +[ -n "$DB_URL" ] || { echo "no DB_URL from the app container" >&2; exit 1; } +export DB_URL +env_file="${MOVIES_ENV_FILE:-$HOME/.config/movies/tmdb.env}" +if [ -r "$env_file" ]; then + set -a + . "$env_file" + set +a +fi +exec bun "$script" "$@" diff --git a/scripts/movies-tmdb.ts b/scripts/movies-tmdb.ts new file mode 100644 index 0000000..684d343 --- /dev/null +++ b/scripts/movies-tmdb.ts @@ -0,0 +1,38 @@ +/** + * TMDB pass for the movies & TV tracker: match unmatched titles to TMDB ids, merge rows that turn + * out to be the same TMDB title, and cache posters, genres, year, runtime, cast and episode numbers. + * Needs TMDB_API_KEY (v3 key or v4 read token); scripts/movies-run.sh loads it from + * ~/.config/movies/tmdb.env. Without a key it exits 0 and changes nothing. + * + * scripts/movies-run.sh tmdb # pending titles + missing/old metadata + * scripts/movies-run.sh tmdb --retry-not-found # also retry titles TMDB didn't find before + * scripts/movies-run.sh tmdb --refresh-days 30 # refetch metadata older than 30 days (default 90) + */ +import postgres from 'postgres'; +import { Tmdb, runTmdb } from '../src/lib/server/movies/tmdb'; + +const args = process.argv.slice(2); +const opt = (n: string) => { + const i = args.indexOf(`--${n}`); + return i >= 0 ? args[i + 1] : undefined; +}; +if (!process.env.TMDB_API_KEY) { + console.log('No TMDB_API_KEY set: nothing to do'); + process.exit(0); +} +if (!process.env.DB_URL) + throw new Error('DB_URL is required (use scripts/movies-run.sh on stan-ovh)'); +const sql = postgres(process.env.DB_URL, { max: 1, onnotice: () => {} }); +try { + const m = await runTmdb(sql, new Tmdb(process.env.TMDB_API_KEY), { + retryNotFound: args.includes('--retry-not-found'), + refreshDays: opt('refresh-days') ? Number(opt('refresh-days')) : undefined, + limit: opt('limit') ? Number(opt('limit')) : undefined, + log: (l) => console.log(` ${l}`) + }); + console.log( + `TMDB: tried ${m.tried}, ${m.matched} matched, ${m.merged} merged, ${m.notFound} not found, ${m.refreshed} refreshed, ${m.errors} errors` + ); +} finally { + await sql.end(); +} diff --git a/src/lib/components/SiteChrome.svelte b/src/lib/components/SiteChrome.svelte index eaf1e39..36652b4 100644 --- a/src/lib/components/SiteChrome.svelte +++ b/src/lib/components/SiteChrome.svelte @@ -39,6 +39,7 @@ isOwner: boolean; version: string; inactiveGames?: string[]; + hiddenTrackers?: string[]; }; let { data, children }: { data: ChromeData; children: Snippet } = $props(); const showFooter = $derived(!hidesFooter(page.url.pathname)); @@ -66,7 +67,10 @@ }; const menus: Record = $derived({ '/projects': { label: 'projects', items: projects }, - '/trackers': { label: 'trackers', items: visibleTrackers(data.isOwner, data.inactiveGames) }, + '/trackers': { + label: 'trackers', + items: visibleTrackers(data.isOwner, data.inactiveGames, data.hiddenTrackers) + }, '/stats': { label: 'stats', items: statsPages } }); const socialLinks = [ diff --git a/src/lib/projects.ts b/src/lib/projects.ts index e256a3c..b91a699 100644 --- a/src/lib/projects.ts +++ b/src/lib/projects.ts @@ -351,6 +351,13 @@ const allTrackers: readonly (Tracker & { private: boolean })[] = [ external: false, private: false }, + { + name: 'movies', + subtitle: 'movies and TV shows we watch: Netflix, Plex and cinema, ratings and stats', + href: '/trackers/movies', + external: false, + private: false + }, { name: 'pc', subtitle: 'my PC setup: every part, my devices, the next build and mouse sensitivities', @@ -447,12 +454,19 @@ export const privateTrackers: readonly Tracker[] = allTrackers.filter((t) => t.p const ownerTrackers: readonly Tracker[] = allTrackers.map(strip); /** Trackers for the header, home, /trackers, /start and error pages; with `inactiveGames` (root - * layout data) the games group lists active games first and flags the rest `inactive`. */ + * layout data) the games group lists active games first and flags the rest `inactive`. + * `hidden` (root layout `hiddenTrackers`, e.g. movies when its owner switch is private) drops + * those trackers for everyone else and gives them a lock for the owner. */ export function visibleTrackers( isOwner: boolean, - inactiveGames: readonly string[] = [] + inactiveGames: readonly string[] = [], + hidden: readonly string[] = [] ): readonly Tracker[] { - const list = isOwner ? ownerTrackers : trackers; + let list = isOwner ? ownerTrackers : trackers; + if (hidden.length) + list = isOwner + ? list.map((t) => (hidden.includes(t.name) ? { ...t, locked: true } : t)) + : list.filter((t) => !hidden.includes(t.name)); if (!inactiveGames.length) return list; const games = sortedGames(inactiveGames); return list.map((t) => (t.children === gameTrackers ? { ...t, children: games } : t)); diff --git a/src/lib/server/db/schema/index.ts b/src/lib/server/db/schema/index.ts index fcf13b8..4fe1a9d 100644 --- a/src/lib/server/db/schema/index.ts +++ b/src/lib/server/db/schema/index.ts @@ -29,3 +29,4 @@ export * from './dataholders'; export * from './stats'; export * from './pubg-map'; export * from './ai'; +export * from './movies'; diff --git a/src/lib/server/db/schema/movies.ts b/src/lib/server/db/schema/movies.ts new file mode 100644 index 0000000..4422daa --- /dev/null +++ b/src/lib/server/db/schema/movies.ts @@ -0,0 +1,180 @@ +import { sql } from 'drizzle-orm'; +import { check, date, index, integer, real, text, uniqueIndex } from 'drizzle-orm/pg-core'; +import { moviesSchema } from './schemas'; +import { id, timestamps, timestamptz } from './helpers'; + +// The movies & TV tracker (/trackers/movies). Rows arrive through the idempotent import scripts +// (scripts/movies-import.ts for Netflix, Plex, Letterboxd and manual JSON; scripts/movies-recs-import.ts +// for Ju's recommendations) plus the owner's edit forms. TMDB metadata (posters, genres, runtime, +// cast) is cached on the row by scripts/movies-tmdb.ts, so pages never call TMDB. +// One row per title, deduped by (type, tmdb_id) once matched, else by match_key. + +export const MOVIE_TYPES = ['movie', 'show'] as const; +export type MovieType = (typeof MOVIE_TYPES)[number]; +export const MOVIE_STATUSES = ['watching', 'watched', 'watchlist', 'dropped'] as const; +export type MovieStatus = (typeof MOVIE_STATUSES)[number]; +export const MOVIE_WHO = ['stan', 'juhee', 'both'] as const; +export type MovieWho = (typeof MOVIE_WHO)[number]; +export const MOVIE_PLATFORMS = ['netflix', 'plex', 'cinema', 'other'] as const; +export type MoviePlatform = (typeof MOVIE_PLATFORMS)[number]; +export const MOVIE_SOURCES = ['netflix', 'plex', 'letterboxd', 'manual', 'ju', 'site'] as const; +export type MovieSource = (typeof MOVIE_SOURCES)[number]; +/** pending = not tried yet; matched = TMDB id set by the matcher; manual = id given by the source. */ +export const MOVIE_MATCH = ['pending', 'matched', 'manual', 'not_found'] as const; + +export const movieTitles = moviesSchema.table( + 'titles', + { + id: id(), + type: text('type').notNull(), + tmdbId: integer('tmdb_id'), + /** Normalised `type:title:year` for rows without a TMDB id (and as a merge hint). */ + matchKey: text('match_key').notNull(), + title: text('title').notNull(), + originalTitle: text('original_title'), + year: integer('year'), + status: text('status').notNull().default('watched'), + rating: real('rating'), + rewatchCount: integer('rewatch_count').notNull().default(0), + firstWatched: date('first_watched'), + lastWatched: date('last_watched'), + watchedBy: text('watched_by'), + platform: text('platform'), + /** Where the row first came from; `sources` lists every source that mentioned it. */ + source: text('source').notNull(), + sources: text('sources').array().notNull().default([]), + notes: text('notes'), + // TMDB metadata cache. + matchStatus: text('match_status').notNull().default('pending'), + posterPath: text('poster_path'), + backdropPath: text('backdrop_path'), + overview: text('overview'), + genres: text('genres').array().notNull().default([]), + cast: text('cast').array().notNull().default([]), + /** Movie runtime, or the typical episode runtime for shows (minutes). */ + runtimeMin: integer('runtime_min'), + totalSeasons: integer('total_seasons'), + totalEpisodes: integer('total_episodes'), + metadataAt: timestamptz('metadata_at'), + ...timestamps + }, + (t) => [ + uniqueIndex('titles_tmdb_key') + .on(t.type, t.tmdbId) + .where(sql`${t.tmdbId} IS NOT NULL`), + uniqueIndex('titles_match_key').on(t.matchKey), + index('titles_status_idx').on(t.status), + check('titles_type_check', sql`${t.type} IN ('movie','show')`), + check('titles_status_check', sql`${t.status} IN ('watching','watched','watchlist','dropped')`), + check( + 'titles_rating_check', + sql`${t.rating} IS NULL OR (${t.rating} >= 0.5 AND ${t.rating} <= 5 AND ${t.rating} * 2 = round(${t.rating} * 2))` + ), + check('titles_rewatch_check', sql`${t.rewatchCount} >= 0`), + check( + 'titles_who_check', + sql`${t.watchedBy} IS NULL OR ${t.watchedBy} IN ('stan','juhee','both')` + ), + check( + 'titles_platform_check', + sql`${t.platform} IS NULL OR ${t.platform} IN ('netflix','plex','cinema','other')` + ), + check( + 'titles_source_check', + sql`${t.source} IN ('netflix','plex','letterboxd','manual','ju','site')` + ), + check( + 'titles_match_check', + sql`${t.matchStatus} IN ('pending','matched','manual','not_found')` + ), + check('titles_title_check', sql`length(btrim(${t.title})) > 0`) + ] +); + +/** Episodes of a show: `ep_key` is `se` when numbered, else `s:`. */ +export const movieEpisodes = moviesSchema.table( + 'episodes', + { + id: id(), + titleId: integer('title_id') + .notNull() + .references(() => movieTitles.id, { onDelete: 'cascade' }), + epKey: text('ep_key').notNull(), + season: integer('season'), + episode: integer('episode'), + name: text('name'), + runtimeMin: integer('runtime_min'), + ...timestamps + }, + (t) => [ + uniqueIndex('episodes_title_key').on(t.titleId, t.epKey), + index('episodes_title_idx').on(t.titleId, t.season, t.episode) + ] +); + +/** One viewing (a day's plays of a movie or an episode). `source_key` makes imports idempotent. */ +export const moviePlays = moviesSchema.table( + 'plays', + { + id: id(), + titleId: integer('title_id') + .notNull() + .references(() => movieTitles.id, { onDelete: 'cascade' }), + episodeId: integer('episode_id').references(() => movieEpisodes.id, { onDelete: 'cascade' }), + watchedOn: date('watched_on').notNull(), + watchedAt: timestamptz('watched_at'), + /** Minutes actually watched when the source says so (Netflix, Plex); else runtime is used. */ + durationMin: integer('duration_min'), + who: text('who').notNull().default('stan'), + platform: text('platform'), + source: text('source').notNull(), + sourceKey: text('source_key').notNull(), + ...timestamps + }, + (t) => [ + uniqueIndex('plays_source_key').on(t.sourceKey), + index('plays_title_idx').on(t.titleId), + index('plays_watched_idx').on(t.watchedOn), + check('plays_who_check', sql`${t.who} IN ('stan','juhee','both')`), + check( + 'plays_platform_check', + sql`${t.platform} IS NULL OR ${t.platform} IN ('netflix','plex','cinema','other')` + ) + ] +); + +/** "Ju recommends": Ju's picks, with TMDB metadata cached like titles. */ +export const movieRecs = moviesSchema.table( + 'recs', + { + id: id(), + tmdbId: integer('tmdb_id').notNull(), + type: text('type').notNull(), + title: text('title').notNull(), + forWhom: text('for_whom').notNull(), + reason: text('reason'), + addedAt: timestamptz('added_at').notNull().defaultNow(), + posterPath: text('poster_path'), + year: integer('year'), + genres: text('genres').array().notNull().default([]), + metadataAt: timestamptz('metadata_at'), + ...timestamps + }, + (t) => [ + uniqueIndex('recs_tmdb_key').on(t.type, t.tmdbId), + check('recs_type_check', sql`${t.type} IN ('movie','show')`), + check('recs_for_check', sql`${t.forWhom} IN ('stan','juhee','both')`), + check('recs_title_check', sql`length(btrim(${t.title})) > 0`) + ] +); + +/** Tracker settings (key/value). `visibility` = public | private (public by default). */ +export const movieSettings = moviesSchema.table( + 'settings', + { + key: text('key').primaryKey(), + value: text('value').notNull(), + ...timestamps + }, + (t) => [check('settings_key_check', sql`${t.key} IN ('visibility')`)] +); diff --git a/src/lib/server/db/schema/schemas.ts b/src/lib/server/db/schema/schemas.ts index 488da5a..a08da18 100644 --- a/src/lib/server/db/schema/schemas.ts +++ b/src/lib/server/db/schema/schemas.ts @@ -26,3 +26,4 @@ export const trainsSchema = pgSchema('trains'); export const dataholdersSchema = pgSchema('dataholders'); export const statsSchema = pgSchema('stats'); export const aiSchema = pgSchema('ai'); +export const moviesSchema = pgSchema('movies'); diff --git a/src/lib/server/movies/parse.test.ts b/src/lib/server/movies/parse.test.ts new file mode 100644 index 0000000..07c2d1a --- /dev/null +++ b/src/lib/server/movies/parse.test.ts @@ -0,0 +1,224 @@ +import { describe, expect, it } from 'vitest'; +import { + epKey, + fromManual, + guessDateOrder, + manualFile, + matchKey, + normTitle, + parseCsv, + parseLetterboxd, + parseNetflix, + parsePlex, + parseWhoMap, + plexRows, + recsFile, + splitNetflixTitle, + tmdbFromGuids +} from './parse'; + +const ACTIVITY_HEAD = + 'Profile Name,Start Time,Duration,Attributes,Title,Supplemental Video Type,Device Type,Bookmark,Latest Bookmark,Country'; + +describe('titles', () => { + it('normalises titles and keys', () => { + expect(normTitle('Amélie & Co.: The “Return”')).toBe('amelie and co the return'); + expect(matchKey('movie', 'Past Lives', 2023)).toBe('movie:past lives:2023'); + expect(epKey({ season: 1, episode: 3, name: 'x' })).toBe('s1e3'); + expect(epKey({ season: 2, episode: null, name: 'Bread & Lottery' })).toBe( + 's2:bread and lottery' + ); + }); + it('splits Netflix show titles, keeps colon movies', () => { + const none = new Set(); + expect( + splitNetflixTitle('Stranger Things: Season 1: Chapter One: The Vanishing (Episode 1)', none) + ).toEqual({ + type: 'show', + title: 'Stranger Things', + season: 1, + episode: 1, + name: 'Chapter One: The Vanishing' + }); + expect(splitNetflixTitle('De Luizenmoeder: Seizoen 2: Aflevering', none)).toMatchObject({ + type: 'show', + title: 'De Luizenmoeder', + season: 2 + }); + expect(splitNetflixTitle('Glass Onion: A Knives Out Mystery', none)).toEqual({ + type: 'movie', + title: 'Glass Onion: A Knives Out Mystery' + }); + expect(splitNetflixTitle('Our Planet: Frozen Worlds', new Set(['our planet']))).toMatchObject({ + type: 'show', + title: 'Our Planet', + name: 'Frozen Worlds' + }); + }); +}); + +describe('netflix', () => { + it('parses ViewingActivity: sessions, trailers, short plays, profiles', () => { + const csv = [ + ACTIVITY_HEAD, + 'Stan,2024-04-10 20:00:00,01:20:00,,Glass Onion: A Knives Out Mystery,,TV,,,NL', + // continues after midnight Amsterdam time: same play + 'Stan,2024-04-10 22:00:00,00:40:00,,Glass Onion: A Knives Out Mystery,,TV,,,NL', + 'Stan,2024-04-11 20:00:00,00:01:30,,Glass Onion: A Knives Out Mystery,TRAILER,TV,,,NL', + 'Stan,2024-04-12 20:00:00,00:02:00,,Roma,,TV,,,NL', + 'Juhee,2024-05-01 18:00:00,00:55:00,,Squid Game: Season 2: Bread and Lottery (Episode 1),,iPad,,,NL', + 'Kids,2024-05-01 18:00:00,00:55:00,,Peppa Pig: Season 1: Muddy Puddles (Episode 1),,iPad,,,NL' + ].join('\n'); + const r = parseNetflix(csv, { + who: 'stan', + profiles: parseWhoMap('Stan=stan,Juhee=juhee'), + onlyProfiles: new Set(['stan', 'juhee']) + }); + expect(r.skipped).toBe(3); // trailer, Kids profile, 2-minute Roma + const glass = r.items.find((i) => i.title.startsWith('Glass'))!; + expect(glass.type).toBe('movie'); + expect(glass.plays).toHaveLength(1); + expect(glass.plays[0]).toMatchObject({ + watchedOn: '2024-04-10', + durationMin: 120, + who: 'stan' + }); + const squid = r.items.find((i) => i.title === 'Squid Game')!; + expect(squid.episodes).toEqual([{ season: 2, episode: 1, name: 'Bread and Lottery' }]); + expect(squid.plays[0].who).toBe('juhee'); + }); + it('parses NetflixViewingHistory with guessed date order', () => { + const csv = + 'Title,Date\n"The Crown: Season 1: Wolferton Splash","15/02/2024"\n"Roma","2/3/2024"\n'; + expect(guessDateOrder(['2/3/2024', '15/02/2024'])).toBe('dmy'); + const r = parseNetflix(csv, { who: 'both' }); + expect(r.items.find((i) => i.title === 'Roma')!.plays[0]).toMatchObject({ + watchedOn: '2024-03-02', + who: 'both' + }); + expect(r.items.find((i) => i.title === 'The Crown')!.type).toBe('show'); + }); + it('rejects other CSVs', () => { + expect(() => parseNetflix('a,b\n1,2', { who: 'stan' })).toThrow(/not a Netflix/); + }); +}); + +describe('letterboxd', () => { + it('merges watched, ratings, diary and watchlist', () => { + const items = parseLetterboxd( + { + 'export/watched.csv': + 'Date,Name,Year,Letterboxd URI\n2024-01-05,Past Lives,2023,https://boxd.it/a', + 'export/ratings.csv': + 'Date,Name,Year,Letterboxd URI,Rating\n2024-01-05,Past Lives,2023,https://boxd.it/a,4.5', + 'export/diary.csv': + 'Date,Name,Year,Letterboxd URI,Rating,Rewatch,Tags,Watched Date\n2024-01-05,Past Lives,2023,https://boxd.it/d1,4.5,,,2024-01-04\n2024-06-05,Past Lives,2023,https://boxd.it/d2,5,Yes,,2024-06-05', + 'export/watchlist.csv': + 'Date,Name,Year,Letterboxd URI\n2024-02-01,Perfect Days,2023,https://boxd.it/c' + }, + { who: 'stan' } + ); + const past = items.find((i) => i.title === 'Past Lives')!; + expect(past).toMatchObject({ type: 'movie', year: 2023, status: 'watched' }); + expect(past.plays.map((p) => p.watchedOn)).toEqual(['2024-01-04', '2024-06-05']); + expect(new Set(past.plays.map((p) => p.sourceKey)).size).toBe(2); + expect(items.find((i) => i.title === 'Perfect Days')!.status).toBe('watchlist'); + }); +}); + +describe('plex', () => { + it('reads Tautulli history, skips partial plays and music', () => { + const json = JSON.stringify({ + response: { + data: { + data: [ + { + id: 1, + media_type: 'episode', + title: 'Half Loop', + grandparent_title: 'Severance', + parent_media_index: 1, + media_index: 2, + started: 1717354800, + play_duration: 3200, + friendly_name: 'Juhee', + percent_complete: 98, + guids: ['tmdb://95396'] + }, + { + id: 2, + media_type: 'movie', + title: 'Dune: Part Two', + year: 2024, + started: 1719100000, + friendly_name: 'stan', + percent_complete: 8 + }, + { + id: 3, + media_type: 'track', + title: 'Song', + started: 1719100000, + friendly_name: 'stan', + percent_complete: 100 + } + ] + } + } + }); + const r = parsePlex(plexRows(json, 'json'), { who: 'stan', users: parseWhoMap('juhee=juhee') }); + expect(r.skipped).toBe(2); + expect(r.items).toHaveLength(1); + expect(r.items[0]).toMatchObject({ type: 'show', title: 'Severance', source: 'plex' }); + expect(r.items[0].plays[0]).toMatchObject({ + who: 'juhee', + platform: 'plex', + sourceKey: 'plex:1' + }); + expect(tmdbFromGuids(['imdb://tt1', 'tmdb://95396'])).toBe(95396); + }); + it('reads Tautulli CSV', () => { + const csv = + 'id,media_type,title,year,date,duration,user,percent_complete\n7,movie,Past Lives,2023,1704400000,6000,stan,100\n'; + const r = parsePlex(plexRows(csv, 'csv'), { who: 'stan' }); + expect(r.items[0]).toMatchObject({ type: 'movie', title: 'Past Lives', year: 2023 }); + }); +}); + +describe('manual and recs JSON', () => { + it('validates and converts manual entries', () => { + const parsed = manualFile.parse([ + { type: 'tv', title: 'Shogun', year: 2024, status: 'watchlist' }, + { + type: 'movie', + title: 'Dune: Part Two', + rating: 4.5, + who: 'both', + platform: 'cinema', + watched_on: ['2024-03-02'] + } + ]); + const [shogun, dune] = parsed.map(fromManual); + expect(shogun).toMatchObject({ type: 'show', status: 'watchlist', mode: 'set' }); + expect(dune.plays).toHaveLength(1); + expect(dune.plays[0]).toMatchObject({ + watchedOn: '2024-03-02', + who: 'both', + platform: 'cinema' + }); + expect(manualFile.safeParse([{ type: 'movie', title: 'x', rating: 4.2 }]).success).toBe(false); + }); + it('validates recommendations', () => { + expect( + recsFile.safeParse([ + { tmdb_id: 1, type: 'movie', title: 'Inside Out 2', for: 'both', reason: 'cosy' } + ]).success + ).toBe(true); + expect( + recsFile.safeParse([{ tmdb_id: 1, type: 'movie', title: 'x', for: 'daisy' }]).success + ).toBe(false); + }); + it('parses quoted CSV', () => { + expect(parseCsv('\ufeffa,b\r\n"x, ""y""",2\r\n')).toEqual([{ a: 'x, "y"', b: '2' }]); + }); +}); diff --git a/src/lib/server/movies/parse.ts b/src/lib/server/movies/parse.ts new file mode 100644 index 0000000..5c37b80 --- /dev/null +++ b/src/lib/server/movies/parse.ts @@ -0,0 +1,661 @@ +// Movies & TV tracker: source parsers (Netflix, Letterboxd, Plex/Tautulli, manual JSON) that turn +// an export into ImportItems. Pure functions (no DB, no SvelteKit) so the import scripts and the +// unit tests share them. See scripts/movies-import.ts for the formats each one accepts. +import * as z from 'zod'; +import { + MOVIE_PLATFORMS, + MOVIE_STATUSES, + MOVIE_WHO, + type MoviePlatform, + type MovieSource, + type MovieStatus, + type MovieType, + type MovieWho +} from '../db/schema/movies'; + +export type ImportPlay = { + watchedOn: string; + watchedAt?: string | null; + durationMin?: number | null; + who: MovieWho; + platform: MoviePlatform | null; + sourceKey: string; + episode?: ImportEpisode | null; +}; +export type ImportEpisode = { season: number | null; episode: number | null; name: string | null }; +export type ImportItem = { + type: MovieType; + title: string; + year?: number | null; + tmdbId?: number | null; + source: MovieSource; + /** fill = only set empty fields (exports); set = given fields win (manual JSON, the site). */ + mode: 'fill' | 'set'; + status?: MovieStatus | null; + rating?: number | null; + rewatchCount?: number | null; + firstWatched?: string | null; + lastWatched?: string | null; + who?: MovieWho | null; + platform?: MoviePlatform | null; + notes?: string | null; + episodes?: ImportEpisode[]; + plays: ImportPlay[]; +}; + +// ---------------------------------------------------------------- helpers + +/** Lower-case, accents and punctuation stripped, `&` → and, single spaces. */ +export function normTitle(s: string): string { + return s + .normalize('NFKD') + .replace(/[\u0300-\u036f]/g, '') + .toLowerCase() + .replace(/&/g, ' and ') + .replace(/['’`]/g, '') + .replace(/[^\p{L}\p{N}]+/gu, ' ') + .trim() + .replace(/\s+/g, ' '); +} +export const matchKey = (type: MovieType, title: string, year?: number | null) => + `${type}:${normTitle(title)}:${year ?? ''}`; +export const epKey = (e: ImportEpisode) => + e.episode != null + ? `s${e.season ?? 0}e${e.episode}` + : `s${e.season ?? 0}:${normTitle(e.name ?? '')}`; + +/** Minimal RFC 4180 CSV parser (quotes, doubled quotes, CRLF, BOM). Returns header-keyed rows. */ +export function parseCsv(text: string): Record[] { + const rows: string[][] = []; + let row: string[] = []; + let field = ''; + let quoted = false; + const s = text.replace(/^\uFEFF/, ''); + for (let i = 0; i < s.length; i++) { + const ch = s[i]; + if (quoted) { + if (ch === '"') { + if (s[i + 1] === '"') { + field += '"'; + i++; + } else quoted = false; + } else field += ch; + } else if (ch === '"') quoted = true; + else if (ch === ',') { + row.push(field); + field = ''; + } else if (ch === '\n' || ch === '\r') { + if (ch === '\r' && s[i + 1] === '\n') i++; + row.push(field); + rows.push(row); + row = []; + field = ''; + } else field += ch; + } + if (field !== '' || row.length) { + row.push(field); + rows.push(row); + } + const nonEmpty = rows.filter((r) => r.some((c) => c.trim() !== '')); + if (!nonEmpty.length) return []; + const header = nonEmpty[0].map((h) => h.trim()); + return nonEmpty + .slice(1) + .map((r) => Object.fromEntries(header.map((h, i) => [h, (r[i] ?? '').trim()]))); +} + +/** Calendar date in Europe/Amsterdam for an instant. */ +export const amsDate = (d: Date) => d.toLocaleDateString('sv-SE', { timeZone: 'Europe/Amsterdam' }); +const isoDate = /^\d{4}-\d{2}-\d{2}$/; +const pad = (n: number) => String(n).padStart(2, '0'); +function ymd(y: number, m: number, d: number): string | null { + if (y < 100) y += y < 70 ? 2000 : 1900; + if (m < 1 || m > 12 || d < 1 || d > 31) return null; + return `${y}-${pad(m)}-${pad(d)}`; +} + +/** "Name=who,Other=juhee" → map of normalised profile/user name to who. */ +export function parseWhoMap(spec: string | undefined): Map { + const out = new Map(); + for (const part of (spec ?? '').split(',')) { + const [k, v] = part.split('=').map((x) => x?.trim()); + if (!k || !v) continue; + if (!(MOVIE_WHO as readonly string[]).includes(v)) throw new Error(`bad who "${v}" in map`); + out.set(normTitle(k), v as MovieWho); + } + return out; +} + +// ---------------------------------------------------------------- Netflix + +// Season-like segment in Netflix titles ("Show: Season 2: Episode"), in the languages a Dutch +// account sees. A segment that matches starts the episode part. +const SEASON_SEG = + /^(season|seizoen|staffel|saison|temporada|stagione|series|serie|part|deel|teil|volume|vol\.?|book|boek|chapter|hoofdstuk|limited series|miniserie|miniseries|collection|collectie)\b\s*(\d+|[ivx]+|one|two|three|four|five|six|seven|eight|nine|ten)?/i; +const WORD_NUM: Record = { + one: 1, + two: 2, + three: 3, + four: 4, + five: 5, + six: 6, + seven: 7, + eight: 8, + nine: 9, + ten: 10 +}; +function seasonNumber(seg: string): number { + const m = SEASON_SEG.exec(seg.trim()); + const n = m?.[2]?.toLowerCase(); + if (!n) return 1; + if (/^\d+$/.test(n)) return Number(n); + if (WORD_NUM[n]) return WORD_NUM[n]; + const roman: Record = { i: 1, v: 5, x: 10 }; + let total = 0; + for (let i = 0; i < n.length; i++) { + const a = roman[n[i]] ?? 0; + const b = roman[n[i + 1]] ?? 0; + total += a < b ? -a : a; + } + return total || 1; +} + +export type NetflixTitle = + | { type: 'movie'; title: string } + | { type: 'show'; title: string; season: number; episode: number | null; name: string | null }; + +// "Chapter One: … (Episode 1)": ViewingActivity.csv appends the episode number in most languages. +const EPISODE_SUFFIX = + /\s*\((?:episode|aflevering|folge|épisode|episodio|episódio|odcinek|avsnitt|afsnit|jakso|bölüm|에피소드|エピソード)\s*(\d{1,4})\)\s*$/iu; +function episodeName(name: string | null): { episode: number | null; name: string | null } { + if (!name) return { episode: null, name }; + const m = EPISODE_SUFFIX.exec(name); + if (!m) return { episode: null, name }; + return { episode: Number(m[1]), name: name.slice(0, m.index).trim() || null }; +} + +/** + * Split a Netflix history title. "Show: Season 2: Ep" / "Show: Limited Series: Ep" → episode. + * Without a season segment, a title whose first segment appears with 3+ different remainders in + * the same file (`showPrefixes`) is a show too; everything else is a movie + * ("Mission: Impossible: Dead Reckoning" stays a movie unless Netflix lists 3+ of them). + */ +export function splitNetflixTitle(raw: string, showPrefixes: Set): NetflixTitle { + const segs = raw.split(': ').map((s) => s.trim()); + const si = segs.findIndex((s, i) => i > 0 && SEASON_SEG.test(s)); + if (si > 0) { + const ep = episodeName(segs.slice(si + 1).join(': ') || null); + return { + type: 'show', + title: segs.slice(0, si).join(': '), + season: seasonNumber(segs[si]), + ...ep + }; + } + if (segs.length >= 2 && showPrefixes.has(normTitle(segs[0]))) + return { type: 'show', title: segs[0], season: 1, ...episodeName(segs.slice(1).join(': ')) }; + return { type: 'movie', title: raw.trim() }; +} + +function netflixShowPrefixes(titles: string[]): Set { + const rest = new Map>(); + for (const t of new Set(titles)) { + const segs = t.split(': '); + if (segs.length < 2) continue; + const k = normTitle(segs[0]); + (rest.get(k) ?? rest.set(k, new Set()).get(k)!).add(segs.slice(1).join(': ')); + } + return new Set([...rest].filter(([, s]) => s.size >= 3).map(([k]) => k)); +} + +/** Date in NetflixViewingHistory.csv: ISO, D-M-YYYY (Dutch site), or D/M/Y vs M/D/Y (`order`). */ +function netflixDate(s: string, order: 'dmy' | 'mdy'): string | null { + const t = s.trim(); + if (isoDate.test(t)) return t; + let m = /^(\d{1,2})-(\d{1,2})-(\d{2,4})$/.exec(t); + if (m) return ymd(+m[3], +m[2], +m[1]); + m = /^(\d{1,2})[/.](\d{1,2})[/.](\d{2,4})$/.exec(t); + if (m) return order === 'dmy' ? ymd(+m[3], +m[2], +m[1]) : ymd(+m[3], +m[1], +m[2]); + return null; +} +/** Guess D/M vs M/D for slash dates from the whole file; null when nothing decides it. */ +export function guessDateOrder(dates: string[]): 'dmy' | 'mdy' | null { + for (const d of dates) { + const m = /^(\d{1,2})[/.](\d{1,2})[/.]\d{2,4}$/.exec(d.trim()); + if (!m) continue; + if (+m[1] > 12) return 'dmy'; + if (+m[2] > 12) return 'mdy'; + } + return null; +} +const hms = (s: string) => { + const m = /^(\d+):(\d{2}):(\d{2})$/.exec(s.trim()); + return m ? +m[1] * 60 + +m[2] + +m[3] / 60 : null; +}; + +export type NetflixOptions = { + /** Who watched, for NetflixViewingHistory.csv (no profile column) and unmapped profiles. */ + who: MovieWho; + /** ViewingActivity.csv profile name → who; profiles not in the map use `who`. */ + profiles?: Map; + /** Only these profiles (normalised names); empty = all. */ + onlyProfiles?: Set; + dateOrder?: 'dmy' | 'mdy'; + /** ViewingActivity sessions shorter than this (summed per title and day) are skipped. */ + minMinutes?: number; +}; + +/** Netflix ViewingActivity.csv (Get my info) or NetflixViewingHistory.csv (Viewing activity page). */ +export function parseNetflix( + text: string, + o: NetflixOptions +): { items: ImportItem[]; skipped: number } { + const rows = parseCsv(text); + if (!rows.length) return { items: [], skipped: 0 }; + const cols = Object.keys(rows[0]); + const activity = cols.includes('Start Time') && cols.includes('Title'); + if (!activity && !(cols.includes('Title') && cols.includes('Date'))) + throw new Error(`not a Netflix history CSV (columns: ${cols.join(', ')})`); + const prefixes = netflixShowPrefixes(rows.map((r) => r.Title)); + const minMinutes = o.minMinutes ?? 5; + let skipped = 0; + // (who, title, date) → aggregated play + const plays = new Map< + string, + { raw: string; date: string; at: string | null; min: number | null; who: MovieWho } + >(); + if (activity) { + // One play per viewing session: sessions of the same title by the same person that start + // within SESSION_GAP of the previous one's end are one play (a film paused past midnight), + // dated by the session's first Amsterdam day; same-day sessions are one play too. + const SESSION_GAP = 3 * 3600_000; + const open = new Map(); + const sorted = rows + .map((r) => ({ r, t: new Date((r['Start Time'] ?? '').replace(' ', 'T') + 'Z').getTime() })) + .sort((a, b) => (Number.isNaN(a.t) ? 0 : a.t) - (Number.isNaN(b.t) ? 0 : b.t)); + for (const { r } of sorted) { + if (r['Supplemental Video Type']) { + skipped++; + continue; + } + const profile = normTitle(r['Profile Name'] ?? ''); + if (o.onlyProfiles?.size && !o.onlyProfiles.has(profile)) { + skipped++; + continue; + } + const who = o.profiles?.get(profile) ?? o.who; + const at = new Date(r['Start Time'].replace(' ', 'T') + 'Z'); + if (Number.isNaN(at.getTime()) || !r.Title) { + skipped++; + continue; + } + const min = hms(r.Duration ?? '') ?? 0; + const session = `${who}|${r.Title}`; + const prev = open.get(session); + const k = + prev && at.getTime() <= prev.end + SESSION_GAP ? prev.key : `${session}|${amsDate(at)}`; + const date = k.slice(k.lastIndexOf('|') + 1); + open.set(session, { key: k, end: at.getTime() + min * 60_000 }); + const p = plays.get(k); + if (p) { + p.min = (p.min ?? 0) + min; + if (at.toISOString() < (p.at ?? '')) p.at = at.toISOString(); + } else plays.set(k, { raw: r.Title, date, at: at.toISOString(), min, who }); + } + for (const [k, p] of plays) + if ((p.min ?? 0) < minMinutes) { + plays.delete(k); + skipped++; + } + } else { + const order = o.dateOrder ?? guessDateOrder(rows.map((r) => r.Date)) ?? 'dmy'; + for (const r of rows) { + const date = netflixDate(r.Date, order); + if (!date || !r.Title) { + skipped++; + continue; + } + plays.set(`${o.who}|${r.Title}|${date}`, { + raw: r.Title, + date, + at: null, + min: null, + who: o.who + }); + } + } + const items = new Map(); + for (const p of plays.values()) { + const t = splitNetflixTitle(p.raw, prefixes); + const key = matchKey(t.type, t.title); + let item = items.get(key); + if (!item) { + item = { + type: t.type, + title: t.title, + source: 'netflix', + mode: 'fill', + platform: 'netflix', + plays: [], + episodes: [] + }; + items.set(key, item); + } + const episode = + t.type === 'show' ? { season: t.season, episode: t.episode, name: t.name } : null; + if (episode && !item.episodes!.some((e) => epKey(e) === epKey(episode))) + item.episodes!.push(episode); + item.plays.push({ + watchedOn: p.date, + watchedAt: p.at, + durationMin: p.min != null ? Math.round(p.min) : null, + who: p.who, + platform: 'netflix', + sourceKey: `netflix:${p.who}:${normTitle(p.raw)}:${p.date}`, + episode + }); + } + return { items: [...items.values()], skipped }; +} + +// ---------------------------------------------------------------- Letterboxd + +export type LetterboxdOptions = { who: MovieWho; platform?: MoviePlatform | null }; + +/** + * Letterboxd data export (Settings → Data → Export your data): the zip's CSVs, keyed by file name. + * Uses diary.csv (one play per diary entry, on its Watched Date), ratings.csv (latest rating), + * watched.csv (status watched, no play: its date is when it was logged) and watchlist.csv. + * Letterboxd is films only, so every item is a movie. + */ +export function parseLetterboxd(files: Record, o: LetterboxdOptions): ImportItem[] { + const get = (name: string) => { + const k = Object.keys(files).find((f) => f.replace(/^.*\//, '').toLowerCase() === name); + return k ? parseCsv(files[k]) : []; + }; + const items = new Map(); + const item = (r: Record) => { + const year = /^\d{4}$/.test(r.Year ?? '') ? Number(r.Year) : null; + const key = matchKey('movie', r.Name, year); + let it = items.get(key); + if (!it) { + it = { + type: 'movie', + title: r.Name, + year, + source: 'letterboxd', + mode: 'fill', + plays: [], + platform: o.platform ?? null + }; + items.set(key, it); + } + return it; + }; + const rating = (s: string | undefined) => { + const n = Number(s); + return s && n >= 0.5 && n <= 5 ? Math.round(n * 2) / 2 : null; + }; + for (const r of get('watchlist.csv')) if (r.Name) item(r).status ??= 'watchlist'; + for (const r of get('watched.csv')) if (r.Name) item(r).status = 'watched'; + for (const r of get('ratings.csv')) { + if (!r.Name) continue; + const it = item(r); + it.status = 'watched'; + it.rating = rating(r.Rating) ?? it.rating; + } + const diary = get('diary.csv').sort((a, b) => + (a['Watched Date'] || a.Date).localeCompare(b['Watched Date'] || b.Date) + ); + diary.forEach((r, i) => { + if (!r.Name) return; + const date = r['Watched Date'] || r.Date; + if (!isoDate.test(date)) return; + const it = item(r); + it.status = 'watched'; + it.rating = rating(r.Rating) ?? it.rating; + it.plays.push({ + watchedOn: date, + who: o.who, + platform: o.platform ?? null, + sourceKey: `letterboxd:${r['Letterboxd URI'] || `${normTitle(r.Name)}:${r.Year}:${date}:${i}`}` + }); + }); + return [...items.values()]; +} + +// ---------------------------------------------------------------- Plex / Tautulli + +export type PlexOptions = { + who: MovieWho; + users?: Map; + onlyUsers?: Set; + /** Skip plays below this percent watched when the export says (Tautulli percent_complete). */ + minPercent?: number; +}; + +const pick = (r: Record, ...keys: string[]) => { + for (const k of keys) { + const v = r[k]; + if (v !== undefined && v !== null && v !== '') return v; + } + return undefined; +}; +const num = (v: unknown) => (v === undefined || v === '' || v === null ? null : Number(v)); + +/** TMDB id from a Plex/Tautulli guid string or Guid array ("tmdb://603", "themoviedb://603"). */ +export function tmdbFromGuids(v: unknown): number | null { + const list = Array.isArray(v) + ? v.map((g) => (typeof g === 'object' && g ? (g as { id?: string }).id : g)) + : [v]; + for (const g of list) { + const m = /(?:tmdb|themoviedb):\/\/(\d+)/.exec(String(g ?? '')); + if (m) return Number(m[1]); + } + return null; +} + +function plexDate(v: unknown): Date | null { + if (v === undefined || v === null || v === '') return null; + const s = String(v).trim(); + if (/^\d{9,11}$/.test(s)) return new Date(Number(s) * 1000); + if (/^\d{12,14}$/.test(s)) return new Date(Number(s)); + const d = new Date(s.includes('T') || s.includes(' ') ? s.replace(' ', 'T') : `${s}T12:00:00Z`); + return Number.isNaN(d.getTime()) ? null : d; +} + +/** Rows from a Tautulli history CSV/JSON (get_history), or Plex's /status/sessions/history/all JSON. */ +export function plexRows(text: string, kind: 'json' | 'csv'): Record[] { + if (kind === 'csv') return parseCsv(text); + const j = JSON.parse(text); + const arr = Array.isArray(j) + ? j + : (j?.response?.data?.data ?? + j?.response?.data ?? + j?.MediaContainer?.Metadata ?? + j?.data ?? + j?.history); + if (!Array.isArray(arr)) throw new Error('no history array found in the Plex/Tautulli JSON'); + return arr; +} + +export function parsePlex( + rows: Record[], + o: PlexOptions +): { items: ImportItem[]; skipped: number } { + const items = new Map(); + let skipped = 0; + rows.forEach((r, i) => { + const mediaType = String(pick(r, 'media_type', 'type', 'Media Type') ?? '').toLowerCase(); + const user = normTitle( + String(pick(r, 'friendly_name', 'user', 'username', 'User', 'accountName', 'account') ?? '') + ); + if (o.onlyUsers?.size && !o.onlyUsers.has(user)) return void skipped++; + const pct = num(pick(r, 'percent_complete', 'Percent Complete')); + if (pct != null && pct < (o.minPercent ?? 50)) return void skipped++; + const at = plexDate( + pick(r, 'started', 'date', 'viewedAt', 'viewed_at', 'Date', 'Started', 'stopped') + ); + if (!at) return void skipped++; + const who = o.users?.get(user) ?? o.who; + const isEp = mediaType === 'episode'; + if (!isEp && mediaType !== 'movie') return void skipped++; // tracks, photos, clips + const show = String(pick(r, 'grandparent_title', 'grandparentTitle', 'Show') ?? ''); + const title = isEp ? show : String(pick(r, 'title', 'Title', 'full_title') ?? ''); + if (!title) return void skipped++; + const year = num(pick(r, isEp ? 'grandparent_year' : 'year', 'year', 'Year')); + const type: MovieType = isEp ? 'show' : 'movie'; + const tmdb = isEp + ? tmdbFromGuids(pick(r, 'grandparent_guids', 'grandparentGuid')) + : tmdbFromGuids(pick(r, 'guids', 'Guid', 'guid')); + const key = tmdb + ? `${type}:tmdb:${tmdb}` + : matchKey(type, title, year && year > 1800 ? year : null); + let it = items.get(key); + if (!it) { + it = { + type, + title, + year: year && year > 1800 ? year : null, + tmdbId: tmdb, + source: 'plex', + mode: 'fill', + platform: 'plex', + plays: [], + episodes: [] + }; + items.set(key, it); + } + const episode = isEp + ? { + season: num(pick(r, 'parent_media_index', 'parentIndex', 'Season')), + episode: num(pick(r, 'media_index', 'index', 'Episode')), + name: (pick(r, 'title', 'Title') as string) ?? null + } + : null; + if (episode && !it.episodes!.some((e) => epKey(e) === epKey(episode))) + it.episodes!.push(episode); + const secs = num(pick(r, 'play_duration', 'duration', 'Duration')); + const id = pick(r, 'id', 'row_id', 'reference_id', 'historyKey'); + const rk = pick(r, 'rating_key', 'ratingKey'); + it.plays.push({ + watchedOn: amsDate(at), + watchedAt: at.toISOString(), + durationMin: secs != null && Number.isFinite(secs) ? Math.round(secs / 60) : null, + who, + platform: 'plex', + sourceKey: + id != null + ? `plex:${id}` + : `plex:${rk ?? normTitle(title)}:${episode ? epKey(episode) : ''}:${user}:${at.getTime()}:${i}`, + episode + }); + }); + return { items: [...items.values()], skipped }; +} + +// ---------------------------------------------------------------- manual JSON (Ju / Daisy) + +const date = z.string().regex(isoDate, 'date must be YYYY-MM-DD'); +const typeIn = z + .enum(['movie', 'show', 'tv']) + .transform((t) => (t === 'tv' ? 'show' : t) as MovieType); +const ratingIn = z + .number() + .min(0.5) + .max(5) + .refine((n) => Number.isInteger(n * 2), 'rating must be in steps of 0.5'); + +export const manualItem = z.object({ + type: typeIn, + title: z.string().trim().min(1).max(300), + year: z.number().int().min(1870).max(2100).nullish(), + tmdb_id: z.number().int().positive().nullish(), + status: z.enum(MOVIE_STATUSES).nullish(), + rating: ratingIn.nullish(), + rewatch_count: z.number().int().min(0).max(1000).nullish(), + first_watched: date.nullish(), + last_watched: date.nullish(), + who: z.enum(MOVIE_WHO).nullish(), + platform: z.enum(MOVIE_PLATFORMS).nullish(), + notes: z.string().trim().max(2000).nullish(), + source: z.enum(['manual', 'ju']).default('manual'), + /** Days a movie was watched (one play each). For shows use episodes[].watched_on. */ + watched_on: z.array(date).max(500).default([]), + episodes: z + .array( + z.object({ + season: z.number().int().min(0).max(200), + episode: z.number().int().min(0).max(5000).nullish(), + name: z.string().trim().max(300).nullish(), + watched_on: date.nullish() + }) + ) + .max(5000) + .default([]) +}); +export const manualFile = z.array(manualItem).max(20000); +export type ManualItem = z.infer; + +export function fromManual(m: ManualItem): ImportItem { + const who = m.who ?? 'stan'; + const id = m.tmdb_id + ? `tmdb${m.tmdb_id}` + : normTitle(m.title).replace(/ /g, '-') + (m.year ? `-${m.year}` : ''); + const plays: ImportPlay[] = m.watched_on.map((d) => ({ + watchedOn: d, + who, + platform: m.platform ?? null, + sourceKey: `${m.source}:${m.type}:${id}:${d}` + })); + const episodes: ImportEpisode[] = m.episodes.map((e) => ({ + season: e.season, + episode: e.episode ?? null, + name: e.name ?? null + })); + m.episodes.forEach((e, i) => { + if (e.watched_on) + plays.push({ + watchedOn: e.watched_on, + who, + platform: m.platform ?? null, + sourceKey: `${m.source}:${m.type}:${id}:${epKey(episodes[i])}:${e.watched_on}`, + episode: episodes[i] + }); + }); + return { + type: m.type, + title: m.title, + year: m.year ?? null, + tmdbId: m.tmdb_id ?? null, + source: m.source, + mode: 'set', + status: m.status ?? null, + rating: m.rating ?? null, + rewatchCount: m.rewatch_count ?? null, + firstWatched: m.first_watched ?? null, + lastWatched: m.last_watched ?? null, + who: m.who ?? null, + platform: m.platform ?? null, + notes: m.notes ?? null, + episodes, + plays + }; +} + +// ---------------------------------------------------------------- Ju recommends + +export const recItem = z.object({ + tmdb_id: z.number().int().positive(), + type: typeIn, + title: z.string().trim().min(1).max(300), + for: z.enum(MOVIE_WHO), + reason: z.string().trim().max(600).nullish(), + added_at: z + .string() + .trim() + .refine((s) => !Number.isNaN(Date.parse(s)), 'added_at must be an ISO date or date-time') + .nullish() +}); +export const recsFile = z.array(recItem).max(5000); +export type RecItem = z.infer; diff --git a/src/lib/server/movies/site.ts b/src/lib/server/movies/site.ts new file mode 100644 index 0000000..7af048d --- /dev/null +++ b/src/lib/server/movies/site.ts @@ -0,0 +1,264 @@ +// Movies & TV tracker (/trackers/movies): page reads and the owner's edit actions. +// Imports go through scripts/movies-import.ts; everything here reuses the same store functions. +import { client as sql } from '#lib/server/db/index.js'; +import * as z from 'zod'; +import { MOVIE_PLATFORMS, MOVIE_STATUSES, MOVIE_WHO } from '#lib/server/db/schema/movies.js'; +import { importItems } from './store'; +import { normTitle } from './parse'; +import { Tmdb, runTmdb } from './tmdb'; + +export type Visibility = 'public' | 'private'; + +let cached: { at: number; value: Visibility } | null = null; +/** The owner's visibility switch (public by default; private hides the tracker from everyone else). */ +export async function getVisibility(fresh = false): Promise { + if (!fresh && cached && Date.now() - cached.at < 30_000) return cached.value; + let value: Visibility = 'public'; + try { + const [r] = await sql`select value from movies.settings where key = 'visibility'`; + value = r?.value === 'private' ? 'private' : 'public'; + } catch { + // Schema not migrated yet (fresh dev DB): treat as public. + } + cached = { at: Date.now(), value }; + return value; +} +/** Tracker names hidden from the public navigation (root layout → visibleTrackers). */ +export async function loadHiddenTrackers(): Promise { + return (await getVisibility()) === 'private' ? ['movies'] : []; +} + +export type Title = { + id: number; + type: 'movie' | 'show'; + tmdbId: number | null; + title: string; + year: number | null; + status: string; + rating: number | null; + rewatchCount: number; + firstWatched: string | null; + lastWatched: string | null; + watchedBy: string | null; + platform: string | null; + source: string; + sources: string[]; + notes: string | null; + posterPath: string | null; + overview: string | null; + genres: string[]; + cast: string[]; + runtimeMin: number | null; + totalSeasons: number | null; + totalEpisodes: number | null; + plays: number; + episodesWatched: number; + seasons: { season: number; watched: number }[]; + matchStatus: string; +}; + +export async function loadTitles(): Promise { + const rows = await sql` + select t.id, t.type, t.tmdb_id, t.title, t.year, t.status, t.rating, t.rewatch_count, + t.first_watched::text, t.last_watched::text, t.watched_by, t.platform, t.source, t.sources, t.notes, + t.poster_path, t.overview, t.genres, t."cast", t.runtime_min, t.total_seasons, t.total_episodes, t.match_status, + coalesce(p.plays, 0)::int as plays, coalesce(e.watched, 0)::int as episodes_watched, coalesce(e.seasons, '[]') as seasons + from movies.titles t + left join (select title_id, count(*) as plays from movies.plays group by title_id) p on p.title_id = t.id + left join ( + select title_id, sum(n) as watched, json_agg(json_build_object('season', season, 'watched', n) order by season) as seasons + from (select e.title_id, coalesce(e.season, 0) as season, count(*) as n from movies.episodes e + where exists (select 1 from movies.plays pl where pl.episode_id = e.id) group by 1, 2) s + group by title_id + ) e on e.title_id = t.id + order by coalesce(t.last_watched, t.created_at::date) desc nulls last, t.id desc`; + return rows.map((r) => ({ + id: r.id, + type: r.type, + tmdbId: r.tmdb_id, + title: r.title, + year: r.year, + status: r.status, + rating: r.rating, + rewatchCount: r.rewatch_count, + firstWatched: r.first_watched, + lastWatched: r.last_watched, + watchedBy: r.watched_by, + platform: r.platform, + source: r.source, + sources: r.sources, + notes: r.notes, + posterPath: r.poster_path, + overview: r.overview, + genres: r.genres, + cast: r.cast, + runtimeMin: r.runtime_min, + totalSeasons: r.total_seasons, + totalEpisodes: r.total_episodes, + plays: r.plays, + episodesWatched: r.episodes_watched, + seasons: r.seasons, + matchStatus: r.match_status + })); +} + +export type Stats = { + months: { month: string; movies: number; episodes: number; minutes: number }[]; + years: { year: string; movies: number; episodes: number; minutes: number }[]; + genres: { genre: string; titles: number }[]; + who: { who: string; plays: number; minutes: number }[]; + platforms: { platform: string; plays: number; minutes: number }[]; + totals: { plays: number; minutes: number; movies: number; shows: number; episodes: number }; +}; + +export async function loadStats(): Promise { + // Minutes per play: what the source measured, else the episode/movie runtime from TMDB. + const base = sql` + select p.watched_on, p.who, coalesce(p.platform, 'other') as platform, t.type, + coalesce(p.duration_min, e.runtime_min, t.runtime_min, 0) as minutes, p.title_id, p.episode_id + from movies.plays p join movies.titles t on t.id = p.title_id left join movies.episodes e on e.id = p.episode_id`; + const [months, years, genres, who, platforms, [totals]] = await Promise.all([ + sql`select to_char(watched_on, 'YYYY-MM') as month, count(*) filter (where type = 'movie')::int as movies, + count(*) filter (where type = 'show')::int as episodes, sum(minutes)::int as minutes + from (${base}) b group by 1 order by 1`, + sql`select to_char(watched_on, 'YYYY') as year, count(*) filter (where type = 'movie')::int as movies, + count(*) filter (where type = 'show')::int as episodes, sum(minutes)::int as minutes + from (${base}) b group by 1 order by 1`, + sql`select g as genre, count(*)::int as titles from movies.titles t, unnest(t.genres) g + where t.status in ('watched','watching','dropped') group by 1 order by 2 desc, 1 limit 12`, + sql`select who, count(*)::int as plays, sum(minutes)::int as minutes from (${base}) b group by 1 order by 2 desc`, + sql`select platform, count(*)::int as plays, sum(minutes)::int as minutes from (${base}) b group by 1 order by 2 desc`, + sql`select count(*)::int as plays, coalesce(sum(minutes), 0)::int as minutes, + (select count(*) from movies.titles where type = 'movie' and status in ('watched', 'watching'))::int as movies, + (select count(*) from movies.titles where type = 'show' and status in ('watched', 'watching'))::int as shows, + count(*) filter (where type = 'show')::int as episodes from (${base}) b` + ]); + return { months, years, genres, who, platforms, totals } as unknown as Stats; +} + +export async function loadRecs() { + const rows = + await sql`select id, tmdb_id, type, title, for_whom, reason, added_at, poster_path, year, genres + from movies.recs order by added_at desc, id desc limit 200`; + return rows.map((r) => ({ + id: r.id as number, + tmdbId: r.tmdb_id as number, + type: r.type as 'movie' | 'show', + title: r.title as string, + forWhom: r.for_whom as string, + reason: r.reason as string | null, + addedAt: new Date(r.added_at as string | Date).toISOString(), + posterPath: r.poster_path as string | null, + year: r.year as number | null, + genres: r.genres as string[] + })); +} + +// ---------------------------------------------------------------- owner actions + +type Result = { ok: true; id?: number } | { ok: false; message: string }; +const blank = (v: unknown) => (v === '' || v === null || v === undefined ? null : v); +const opt = (s: T) => z.preprocess(blank, s.nullable()); +const rating = z.coerce + .number() + .min(0.5) + .max(5) + .refine((n) => Number.isInteger(n * 2), 'rating must be in steps of 0.5'); +const date = z.string().regex(/^\d{4}-\d{2}-\d{2}$/, 'date must be YYYY-MM-DD'); + +const updateInput = z.object({ + id: z.coerce.number().int().positive(), + status: z.enum(MOVIE_STATUSES), + rating: opt(rating), + watched_by: opt(z.enum(MOVIE_WHO)), + platform: opt(z.enum(MOVIE_PLATFORMS)), + rewatch_count: z.coerce.number().int().min(0).max(1000), + notes: opt(z.string().trim().max(2000)) +}); + +export async function updateTitle(form: FormData): Promise { + const p = updateInput.safeParse(Object.fromEntries(form)); + if (!p.success) return { ok: false, message: p.error.issues[0]?.message ?? 'Invalid' }; + const v = p.data; + await sql`update movies.titles set status = ${v.status}, rating = ${v.rating}, watched_by = ${v.watched_by}, + platform = ${v.platform}, rewatch_count = ${v.rewatch_count}, notes = ${v.notes} where id = ${v.id}`; + return { ok: true, id: v.id }; +} + +const addInput = z.object({ + type: z.enum(['movie', 'show']), + title: z.string().trim().min(1, 'title is required').max(300), + year: opt(z.coerce.number().int().min(1870).max(2100)), + status: z.enum(MOVIE_STATUSES), + rating: opt(rating), + who: opt(z.enum(MOVIE_WHO)), + platform: opt(z.enum(MOVIE_PLATFORMS)), + watched_on: opt(date) +}); + +export async function addTitle(form: FormData): Promise { + const p = addInput.safeParse(Object.fromEntries(form)); + if (!p.success) return { ok: false, message: p.error.issues[0]?.message ?? 'Invalid' }; + const v = p.data; + const who = v.who ?? 'stan'; + const slug = normTitle(v.title).replace(/ /g, '-') + (v.year ? `-${v.year}` : ''); + await importItems(sql, [ + { + type: v.type, + title: v.title, + year: v.year, + source: 'site', + mode: 'set', + status: v.status, + rating: v.rating, + who: v.who, + platform: v.platform, + plays: + v.watched_on && v.type === 'movie' + ? [ + { + watchedOn: v.watched_on, + who, + platform: v.platform, + sourceKey: `site:${v.type}:${slug}:${v.watched_on}` + } + ] + : [], + firstWatched: v.type === 'show' ? v.watched_on : null, + lastWatched: v.type === 'show' ? v.watched_on : null + } + ]); + // Match right away when the app has a key; otherwise the next `movies-run.sh tmdb` does it. + if (process.env.TMDB_API_KEY) { + try { + await runTmdb(sql, new Tmdb(process.env.TMDB_API_KEY), { limit: 5 }); + } catch { + // Leave it pending. + } + } + return { ok: true }; +} + +export async function deleteTitle(form: FormData): Promise { + const id = Number(form.get('id')); + if (!Number.isInteger(id) || id <= 0) return { ok: false, message: 'Missing id' }; + await sql`delete from movies.titles where id = ${id}`; + return { ok: true }; +} + +export async function deleteRec(form: FormData): Promise { + const id = Number(form.get('id')); + if (!Number.isInteger(id) || id <= 0) return { ok: false, message: 'Missing id' }; + await sql`delete from movies.recs where id = ${id}`; + return { ok: true }; +} + +export async function setVisibility(form: FormData): Promise { + const v = form.get('visibility'); + if (v !== 'public' && v !== 'private') + return { ok: false, message: 'visibility must be public or private' }; + await sql`insert into movies.settings (key, value) values ('visibility', ${v}) + on conflict (key) do update set value = excluded.value`; + cached = null; + return { ok: true }; +} diff --git a/src/lib/server/movies/store.ts b/src/lib/server/movies/store.ts new file mode 100644 index 0000000..2de56cd --- /dev/null +++ b/src/lib/server/movies/store.ts @@ -0,0 +1,240 @@ +// Movies & TV tracker: idempotent writes shared by the import scripts and the site's owner forms. +// Takes a postgres.js client (no SvelteKit imports). Re-running an import changes nothing: plays +// are keyed by source_key, titles by (type, tmdb_id) or match_key, episodes by (title, ep_key). +import type { Sql, TransactionSql } from 'postgres'; +import { + epKey, + matchKey, + normTitle, + type ImportEpisode, + type ImportItem, + type RecItem +} from './parse'; + +type Tx = Sql | TransactionSql; + +export type ImportStats = { + titles: number; + newTitles: number; + plays: number; + newPlays: number; + episodes: number; +}; + +async function findTitle( + tx: Tx, + it: ImportItem +): Promise<{ id: number; year: number | null; tmdb_id: number | null } | null> { + if (it.tmdbId) { + const [r] = + await tx`select id, year, tmdb_id from movies.titles where type = ${it.type} and tmdb_id = ${it.tmdbId}`; + if (r) return r as never; + } + const key = matchKey(it.type, it.title, it.year); + const [exact] = await tx`select id, year, tmdb_id from movies.titles where match_key = ${key}`; + if (exact && (!it.tmdbId || !exact.tmdb_id)) return exact as never; + // Same title, year unknown on one side (Netflix has no years; Letterboxd and Plex do). + const base = `${it.type}:${normTitle(it.title)}:`; + const like = await tx` + select id, year, tmdb_id from movies.titles + where type = ${it.type} and (match_key = ${base} or (${it.year ?? null}::int is null and match_key like ${base.replace(/[%_\\]/g, '\\$&') + '%'})) + ${it.tmdbId ? tx`and (tmdb_id is null or tmdb_id = ${it.tmdbId})` : tx``} + limit 2`; + return like.length === 1 ? (like[0] as never) : null; +} + +async function freeKey(tx: Tx, key: string, suffix: string | number) { + const [taken] = await tx`select 1 from movies.titles where match_key = ${key}`; + return taken ? `${key}#${suffix}` : key; +} + +async function upsertEpisode(tx: Tx, titleId: number, e: ImportEpisode): Promise { + const key = epKey(e); + const [row] = await tx` + insert into movies.episodes (title_id, ep_key, season, episode, name) + values (${titleId}, ${key}, ${e.season}, ${e.episode}, ${e.name}) + on conflict (title_id, ep_key) do update set + name = coalesce(movies.episodes.name, excluded.name), + season = coalesce(movies.episodes.season, excluded.season), + episode = coalesce(movies.episodes.episode, excluded.episode) + returning id`; + if (e.episode == null && e.name) return row.id; + // A numbered episode may also exist unnumbered (Netflix gives names, Plex numbers): fold it in. + if (e.episode != null && e.name) { + const nameKey = epKey({ season: e.season, episode: null, name: e.name }); + const [dup] = + await tx`select id from movies.episodes where title_id = ${titleId} and ep_key = ${nameKey}`; + if (dup) { + await tx`update movies.plays set episode_id = ${row.id} where episode_id = ${dup.id}`; + await tx`delete from movies.episodes where id = ${dup.id}`; + } + } + return row.id; +} + +/** Insert or update one item (title + episodes + plays), then recompute the title's aggregates. */ +export async function upsertItem(tx: Tx, it: ImportItem, s: ImportStats): Promise { + const row = await findTitle(tx, it); + let id: number; + if (!row) { + const key = await freeKey(tx, matchKey(it.type, it.title, it.year), it.tmdbId ?? Date.now()); + const status = + it.status ?? (it.plays.length ? (it.type === 'show' ? 'watching' : 'watched') : 'watchlist'); + const [ins] = await tx` + insert into movies.titles (type, tmdb_id, match_key, title, year, status, rating, rewatch_count, + first_watched, last_watched, watched_by, platform, source, sources, notes, match_status) + values (${it.type}, ${it.tmdbId ?? null}, ${key}, ${it.title.trim()}, ${it.year ?? null}, ${status}, + ${it.rating ?? null}, ${it.rewatchCount ?? 0}, ${it.firstWatched ?? null}, ${it.lastWatched ?? null}, + ${it.who ?? null}, ${it.platform ?? null}, ${it.source}, ${[it.source]}, ${it.notes ?? null}, + ${it.tmdbId ? 'manual' : 'pending'}) + returning id`; + id = ins.id; + s.newTitles++; + } else { + id = row.id; + if (it.mode === 'set') { + await tx` + update movies.titles set + status = coalesce(${it.status ?? null}, status), + rating = coalesce(${it.rating ?? null}::real, rating), + rewatch_count = coalesce(${it.rewatchCount ?? null}::int, rewatch_count), + first_watched = coalesce(${it.firstWatched ?? null}::date, first_watched), + last_watched = coalesce(${it.lastWatched ?? null}::date, last_watched), + watched_by = coalesce(${it.who ?? null}, watched_by), + platform = coalesce(${it.platform ?? null}, platform), + notes = coalesce(${it.notes ?? null}, notes), + year = coalesce(year, ${it.year ?? null}::int), + sources = case when ${it.source} = any(sources) then sources else sources || ${it.source}::text end + where id = ${id}`; + } else { + await tx` + update movies.titles set + rating = coalesce(rating, ${it.rating ?? null}::real), + platform = coalesce(platform, ${it.platform ?? null}), + watched_by = coalesce(watched_by, ${it.who ?? null}), + year = coalesce(year, ${it.year ?? null}::int), + status = case when status = 'watchlist' and ${it.status ?? null}::text = 'watched' then 'watched' else status end, + sources = case when ${it.source} = any(sources) then sources else sources || ${it.source}::text end + where id = ${id}`; + } + if (it.tmdbId && !row.tmdb_id) { + const [clash] = + await tx`select id from movies.titles where type = ${it.type} and tmdb_id = ${it.tmdbId}`; + if (clash) id = await mergeTitles(tx, clash.id, id); + else + await tx`update movies.titles set tmdb_id = ${it.tmdbId}, match_status = 'manual' where id = ${id}`; + } + } + s.titles++; + const epIds = new Map(); + for (const e of it.episodes ?? []) { + epIds.set(epKey(e), await upsertEpisode(tx, id, e)); + s.episodes++; + } + for (const p of it.plays) { + let episodeId: number | null = null; + if (p.episode) + episodeId = epIds.get(epKey(p.episode)) ?? (await upsertEpisode(tx, id, p.episode)); + const res = await tx` + insert into movies.plays (title_id, episode_id, watched_on, watched_at, duration_min, who, platform, source, source_key) + values (${id}, ${episodeId}, ${p.watchedOn}, ${p.watchedAt ?? null}, ${p.durationMin ?? null}, ${p.who}, + ${p.platform}, ${it.source}, ${p.sourceKey}) + on conflict (source_key) do nothing`; + s.plays++; + s.newPlays += res.count; + } + await recompute(tx, id); + return id; +} + +/** Derive dates, rewatches, who, platform and status from the plays (never undoes manual values). */ +export async function recompute(tx: Tx, id: number) { + await tx` + with p as ( + select min(watched_on) as first, max(watched_on) as last, count(distinct watched_on) as days, + count(*) filter (where who in ('stan','both')) as stan, count(*) filter (where who in ('juhee','both')) as juhee, + count(distinct episode_id) as eps, + mode() within group (order by platform) filter (where platform is not null) as platform + from movies.plays where title_id = ${id} + ) + update movies.titles t set + first_watched = least(t.first_watched, p.first), + last_watched = greatest(t.last_watched, p.last), + rewatch_count = case when t.type = 'movie' then greatest(t.rewatch_count, p.days - 1) else t.rewatch_count end, + watched_by = case + when p.stan > 0 and p.juhee > 0 then 'both' + when t.watched_by = 'stan' and p.juhee > 0 then 'both' + when t.watched_by = 'juhee' and p.stan > 0 then 'both' + when t.watched_by is null and p.stan > 0 then 'stan' + when t.watched_by is null and p.juhee > 0 then 'juhee' + else t.watched_by end, + platform = coalesce(t.platform, p.platform), + status = case + when t.status = 'watchlist' and p.days > 0 then (case when t.type = 'show' then 'watching' else 'watched' end) + when t.type = 'show' and t.status = 'watching' and t.total_episodes > 0 and p.eps >= t.total_episodes then 'watched' + else t.status end + from p where t.id = ${id}`; +} + +/** Fold `dropId` into `keepId` (same TMDB title from two sources). Returns keepId. */ +export async function mergeTitles(tx: Tx, keepId: number, dropId: number): Promise { + if (keepId === dropId) return keepId; + const eps = await tx`select id, ep_key from movies.episodes where title_id = ${dropId}`; + for (const e of eps) { + const [same] = + await tx`select id from movies.episodes where title_id = ${keepId} and ep_key = ${e.ep_key}`; + if (same) { + await tx`update movies.plays set episode_id = ${same.id} where episode_id = ${e.id}`; + await tx`delete from movies.episodes where id = ${e.id}`; + } else await tx`update movies.episodes set title_id = ${keepId} where id = ${e.id}`; + } + await tx`update movies.plays set title_id = ${keepId} where title_id = ${dropId}`; + await tx` + update movies.titles k set + rating = coalesce(k.rating, d.rating), + status = case when k.status = 'watchlist' then d.status else k.status end, + rewatch_count = greatest(k.rewatch_count, d.rewatch_count), + first_watched = least(k.first_watched, d.first_watched), + last_watched = greatest(k.last_watched, d.last_watched), + watched_by = case when k.watched_by is null then d.watched_by when d.watched_by is null or d.watched_by = k.watched_by then k.watched_by else 'both' end, + platform = coalesce(k.platform, d.platform), + year = coalesce(k.year, d.year), + notes = coalesce(k.notes, d.notes), + sources = array(select distinct unnest(k.sources || d.sources)) + from movies.titles d where k.id = ${keepId} and d.id = ${dropId}`; + await tx`delete from movies.titles where id = ${dropId}`; + await recompute(tx, keepId); + return keepId; +} + +export async function importItems(sql: Sql, items: ImportItem[]): Promise { + const s: ImportStats = { titles: 0, newTitles: 0, plays: 0, newPlays: 0, episodes: 0 }; + await sql.begin(async (tx) => { + for (const it of items) await upsertItem(tx, it, s); + }); + return s; +} + +export async function upsertRecs( + sql: Sql, + recs: RecItem[], + prune = false +): Promise<{ upserted: number; pruned: number }> { + let pruned = 0; + await sql.begin(async (tx) => { + for (const r of recs) + await tx` + insert into movies.recs (tmdb_id, type, title, for_whom, reason, added_at) + values (${r.tmdb_id}, ${r.type}, ${r.title}, ${r.for}, ${r.reason ?? null}, ${r.added_at ? new Date(r.added_at) : new Date()}) + on conflict (type, tmdb_id) do update set title = excluded.title, for_whom = excluded.for_whom, + reason = excluded.reason, + added_at = coalesce(${r.added_at ? new Date(r.added_at) : null}::timestamptz, movies.recs.added_at)`; + if (prune) { + const keep = recs.map((r) => `${r.type}:${r.tmdb_id}`); + const res = + await tx`delete from movies.recs where not ((type || ':' || tmdb_id) = any(${keep}))`; + pruned = res.count; + } + }); + return { upserted: recs.length, pruned }; +} diff --git a/src/lib/server/movies/tmdb.ts b/src/lib/server/movies/tmdb.ts new file mode 100644 index 0000000..6c26249 --- /dev/null +++ b/src/lib/server/movies/tmdb.ts @@ -0,0 +1,278 @@ +// Movies & TV tracker: TMDB matching and metadata (posters, genres, year, runtime, cast). +// Only scripts (and, when the app env has TMDB_API_KEY, the owner's manual add) call this; pages +// read the cached columns. Accepts a v3 API key or a v4 read access token ("eyJ…"). +// This product uses the TMDB API but is not endorsed or certified by TMDB. +import type { Sql, TransactionSql } from 'postgres'; +import { mergeTitles, recompute } from './store'; +import { normTitle } from './parse'; + +type Tx = Sql | TransactionSql; +const API = 'https://api.themoviedb.org/3'; + +export class Tmdb { + private last = 0; + constructor(private key: string) { + if (!key) throw new Error('TMDB_API_KEY is empty'); + } + async get(path: string, params: Record = {}): Promise { + const url = new URL(API + path); + for (const [k, v] of Object.entries(params)) + if (v !== undefined && v !== '') url.searchParams.set(k, String(v)); + const bearer = this.key.startsWith('eyJ'); + if (!bearer) url.searchParams.set('api_key', this.key); + for (let attempt = 0; attempt < 4; attempt++) { + // ~20 requests/s, well under TMDB's limits. + const wait = this.last + 50 - Date.now(); + if (wait > 0) await new Promise((r) => setTimeout(r, wait)); + this.last = Date.now(); + const res = await fetch(url, { + headers: { + accept: 'application/json', + ...(bearer ? { authorization: `Bearer ${this.key}` } : {}) + } + }); + if (res.status === 429 || res.status >= 500) { + await new Promise((r) => setTimeout(r, 1000 * (attempt + 1))); + continue; + } + // Never include the URL in errors: it can carry the api_key. + if (res.status === 401) throw new Error('TMDB rejected the API key (401)'); + if (res.status === 404) throw Object.assign(new Error('TMDB 404'), { status: 404 }); + if (!res.ok) throw new Error(`TMDB ${path.split('?')[0]} failed: ${res.status}`); + return (await res.json()) as T; + } + throw new Error(`TMDB ${path} kept failing`); + } +} + +type SearchHit = { + id: number; + title?: string; + name?: string; + original_title?: string; + original_name?: string; + release_date?: string; + first_air_date?: string; + popularity?: number; + vote_count?: number; +}; + +const yearOf = (d?: string) => (d && /^\d{4}/.test(d) ? Number(d.slice(0, 4)) : null); + +/** Best TMDB hit for a title: exact normalised title (and year, ±1) first, then the top result. */ +export async function searchTmdb( + t: Tmdb, + type: 'movie' | 'show', + title: string, + year: number | null +) { + const path = type === 'movie' ? '/search/movie' : '/search/tv'; + const yearParam = type === 'movie' ? 'year' : 'first_air_date_year'; + let { results } = await t.get<{ results: SearchHit[] }>(path, { + query: title, + [yearParam]: year ?? undefined, + include_adult: 'false' + }); + if (!results.length && year) + ({ results } = await t.get<{ results: SearchHit[] }>(path, { + query: title, + include_adult: 'false' + })); + if (!results.length) return null; + const want = normTitle(title); + const score = (h: SearchHit) => { + const names = [h.title, h.name, h.original_title, h.original_name] + .filter(Boolean) + .map((n) => normTitle(n!)); + const y = yearOf(h.release_date ?? h.first_air_date); + let s = names.includes(want) ? 10 : 0; + if (year && y) s += y === year ? 5 : Math.abs(y - year) === 1 ? 2 : -5; + s += Math.min(3, Math.log10((h.vote_count ?? 0) + 1)); + return s; + }; + const best = [...results.slice(0, 10)].sort((a, b) => score(b) - score(a))[0]; + if (score(best) >= 10) return best; + // No exact title: accept the top hit only when its year agrees (±1) or, without a year, when + // one title contains the other (localised or subtitled names). Otherwise leave it unmatched. + const top = results[0]; + const topYear = yearOf(top.release_date ?? top.first_air_date); + if (year) return topYear && Math.abs(topYear - year) <= 1 ? top : null; + const names = [top.title, top.name, top.original_title, top.original_name] + .filter(Boolean) + .map((n) => normTitle(n!)); + return names.some((n) => n && (n.includes(want) || want.includes(n))) ? top : null; +} + +type Details = { + id: number; + title?: string; + name?: string; + original_title?: string; + original_name?: string; + release_date?: string; + first_air_date?: string; + overview?: string; + poster_path?: string | null; + backdrop_path?: string | null; + genres?: { name: string }[]; + runtime?: number | null; + episode_run_time?: number[]; + number_of_seasons?: number; + number_of_episodes?: number; + last_episode_to_air?: { runtime?: number | null } | null; + credits?: { cast?: { name: string; order: number }[] }; +}; + +export async function details(t: Tmdb, type: 'movie' | 'show', id: number): Promise
{ + return t.get
(`/${type === 'movie' ? 'movie' : 'tv'}/${id}`, { + append_to_response: 'credits', + language: 'en-US' + }); +} + +async function saveDetails( + tx: Tx, + titleId: number, + type: 'movie' | 'show', + d: Details, + status: 'matched' | 'manual' +) { + const runtime = + type === 'movie' + ? (d.runtime ?? null) + : (d.episode_run_time?.[0] ?? d.last_episode_to_air?.runtime ?? null); + const cast = (d.credits?.cast ?? []) + .sort((a, b) => a.order - b.order) + .slice(0, 8) + .map((c) => c.name); + await tx` + update movies.titles set + tmdb_id = ${d.id}, match_status = ${status}, + original_title = ${d.original_title ?? d.original_name ?? null}, + year = coalesce(${yearOf(d.release_date ?? d.first_air_date)}::int, year), + overview = ${d.overview || null}, poster_path = ${d.poster_path ?? null}, backdrop_path = ${d.backdrop_path ?? null}, + genres = ${(d.genres ?? []).map((g) => g.name)}, "cast" = ${cast}, runtime_min = ${runtime || null}, + total_seasons = ${d.number_of_seasons ?? null}, total_episodes = ${d.number_of_episodes ?? null}, + metadata_at = now() + where id = ${titleId}`; +} + +/** Give Netflix's unnumbered episodes (season + name) their TMDB episode numbers and runtimes. */ +async function numberEpisodes(t: Tmdb, tx: Tx, titleId: number, tvId: number) { + const seasons = + await tx`select distinct season from movies.episodes where title_id = ${titleId} and season is not null`; + for (const { season } of seasons) { + let eps: { episode_number: number; name: string; runtime: number | null }[]; + try { + ({ episodes: eps } = await t.get<{ episodes: typeof eps }>(`/tv/${tvId}/season/${season}`)); + } catch { + continue; + } + const byName = new Map(eps.map((e) => [normTitle(e.name), e])); + for (const e of eps) + await tx`update movies.episodes set runtime_min = coalesce(runtime_min, ${e.runtime ?? null}::int) + where title_id = ${titleId} and season = ${season} and episode = ${e.episode_number}`; + const unnumbered = + await tx`select id, name from movies.episodes where title_id = ${titleId} and season = ${season} and episode is null`; + for (const u of unnumbered) { + const hit = byName.get(normTitle(u.name ?? '')); + if (!hit) continue; + const key = `s${season}e${hit.episode_number}`; + const [dup] = + await tx`select id from movies.episodes where title_id = ${titleId} and ep_key = ${key}`; + if (dup) { + await tx`update movies.plays set episode_id = ${dup.id} where episode_id = ${u.id}`; + await tx`delete from movies.episodes where id = ${u.id}`; + } else + await tx`update movies.episodes set episode = ${hit.episode_number}, ep_key = ${key}, runtime_min = coalesce(runtime_min, ${hit.runtime ?? null}::int) where id = ${u.id}`; + } + } +} + +export type MatchStats = { + tried: number; + matched: number; + notFound: number; + merged: number; + refreshed: number; + errors: number; +}; + +/** + * Match pending titles to TMDB, fetch metadata for matched titles without it (or older than + * `refreshDays`), merge duplicates that turn out to be the same TMDB title, and fill recs posters. + */ +export async function runTmdb( + sql: Sql, + t: Tmdb, + o: { + limit?: number; + retryNotFound?: boolean; + refreshDays?: number; + log?: (s: string) => void; + } = {} +): Promise { + const s: MatchStats = { tried: 0, matched: 0, notFound: 0, merged: 0, refreshed: 0, errors: 0 }; + const log = o.log ?? (() => {}); + const statuses = o.retryNotFound ? ['pending', 'not_found'] : ['pending']; + const pending = + await sql`select id, type, title, year from movies.titles where tmdb_id is null and match_status = any(${statuses}) order by id limit ${o.limit ?? 5000}`; + for (const p of pending) { + s.tried++; + try { + const hit = await searchTmdb(t, p.type, p.title, p.year); + if (!hit) { + await sql`update movies.titles set match_status = 'not_found' where id = ${p.id}`; + s.notFound++; + log(`not found: ${p.type} "${p.title}"${p.year ? ` (${p.year})` : ''}`); + continue; + } + await sql.begin(async (tx) => { + const [owner] = + await tx`select id from movies.titles where type = ${p.type} and tmdb_id = ${hit.id} and id <> ${p.id}`; + if (owner) { + await mergeTitles(tx, owner.id, p.id); + s.merged++; + } else { + await tx`update movies.titles set tmdb_id = ${hit.id}, match_status = 'matched' where id = ${p.id}`; + s.matched++; + } + }); + } catch (e) { + s.errors++; + log(`error matching "${p.title}": ${(e as Error).message}`); + if (/401/.test((e as Error).message)) throw e; + } + } + const stale = await sql` + select id, type, tmdb_id, match_status from movies.titles + where tmdb_id is not null and (metadata_at is null or metadata_at < now() - make_interval(days => ${o.refreshDays ?? 90})) + order by metadata_at nulls first limit ${o.limit ?? 5000}`; + for (const r of stale) { + try { + const d = await details(t, r.type, r.tmdb_id); + await sql.begin(async (tx) => { + await saveDetails(tx, r.id, r.type, d, r.match_status === 'manual' ? 'manual' : 'matched'); + if (r.type === 'show') await numberEpisodes(t, tx, r.id, r.tmdb_id); + await recompute(tx, r.id); + }); + s.refreshed++; + } catch (e) { + s.errors++; + log(`error fetching ${r.type} ${r.tmdb_id}: ${(e as Error).message}`); + } + } + const recs = + await sql`select id, type, tmdb_id from movies.recs where metadata_at is null or metadata_at < now() - interval '90 days'`; + for (const r of recs) { + try { + const d = await details(t, r.type, r.tmdb_id); + await sql`update movies.recs set poster_path = ${d.poster_path ?? null}, year = ${yearOf(d.release_date ?? d.first_air_date)}, + genres = ${(d.genres ?? []).map((g) => g.name)}, metadata_at = now() where id = ${r.id}`; + } catch (e) { + s.errors++; + log(`error fetching rec ${r.type} ${r.tmdb_id}: ${(e as Error).message}`); + } + } + return s; +} diff --git a/src/lib/server/owner.ts b/src/lib/server/owner.ts index 591d1ea..94ed934 100644 --- a/src/lib/server/owner.ts +++ b/src/lib/server/owner.ts @@ -59,7 +59,8 @@ export const ownerWritePrefixes = [ '/trackers/wildlife', '/trackers/music', '/trackers/pc', - '/trackers/ai' + '/trackers/ai', + '/trackers/movies' ] as const; const normalise = (pathname: string) => pathname.toLowerCase().replace(/\/+$/, ''); diff --git a/src/lib/tracker-icons.ts b/src/lib/tracker-icons.ts index 5962e00..eb6ea5d 100644 --- a/src/lib/tracker-icons.ts +++ b/src/lib/tracker-icons.ts @@ -68,6 +68,18 @@ export const trackerIcons: Record = { ink: WHITE, paths: ['M9 18V5l12-2v13', c(6, 18, 3), c(18, 16, 3)] }, + movies: { + from: '#fbbf24', + to: '#f2552c', + ink: WHITE, + // clapperboard + paths: [ + 'M20.2 6 3 11l-.9-2.4c-.3-1.1.3-2.2 1.3-2.5l13.5-4c1.1-.3 2.2.3 2.5 1.3Z', + 'm6.2 5.3 3.1 3.9', + 'm12.4 3.4 3.1 4', + 'M3 11h18v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z' + ] + }, pc: { from: '#22d3ee', to: '#0891b2', diff --git a/src/routes/+layout.server.ts b/src/routes/+layout.server.ts index 15d2a82..554b7dc 100644 --- a/src/routes/+layout.server.ts +++ b/src/routes/+layout.server.ts @@ -1,6 +1,7 @@ import { isAdmin } from '#lib/server/authorization.js'; import { isOwner } from '#lib/server/owner.js'; import { loadInactiveGames } from '#lib/server/games/active.js'; +import { loadHiddenTrackers } from '#lib/server/movies/site.js'; import { dev } from '$app/env'; import { siteEnvironment } from '#lib/title.js'; import type { LayoutServerLoad } from './$types'; @@ -15,5 +16,7 @@ export const load: LayoutServerLoad = async (event) => ({ version: process.env.APP_VERSION || 'dev', environment, /** Games I don't play now: navigation lists them under "non-active" (#lib/projects). */ - inactiveGames: await loadInactiveGames() + inactiveGames: await loadInactiveGames(), + /** Trackers switched to private by their owner setting (movies): hidden from everyone else. */ + hiddenTrackers: await loadHiddenTrackers() }); diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index e3408ef..9dc8d52 100755 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -138,7 +138,7 @@ > diff --git a/src/routes/sitemap.xml/+server.ts b/src/routes/sitemap.xml/+server.ts index c88af49..003bbce 100644 --- a/src/routes/sitemap.xml/+server.ts +++ b/src/routes/sitemap.xml/+server.ts @@ -6,6 +6,7 @@ import { races } from '#lib/derby/races.js'; import { COURSES } from '#lib/language-learner/courses/index.js'; import { gameTrackers } from '#lib/projects.js'; import { and, eq, isNull, ne } from 'drizzle-orm'; +import { getVisibility } from '#lib/server/movies/site.js'; import type { RequestHandler } from './$types'; const staticPaths = [ @@ -41,6 +42,7 @@ const staticPaths = [ '/trackers/wildlife', '/trackers/wildlife/groups', '/trackers/music', + '/trackers/movies', '/trackers/pc', '/trackers/games', ...gameTrackers.map((g) => g.href), @@ -68,7 +70,7 @@ function escapeXml(value: string): string { } export const GET: RequestHandler = async () => { - const [articles, lists, books] = await Promise.all([ + const [articles, lists, books, moviesVisibility] = await Promise.all([ db .select({ slug: blogArticles.slug, updatedAt: blogArticles.updatedAt }) .from(blogArticles) @@ -78,10 +80,13 @@ export const GET: RequestHandler = async () => { .select({ id: bookWorks.id, updatedAt: bookWorks.updatedAt }) .from(bookWorks) // Articles are links to other sites; their pages here are thin. - .where(and(ne(bookWorks.kind, 'article'), isNull(bookWorks.archivedAt))) + .where(and(ne(bookWorks.kind, 'article'), isNull(bookWorks.archivedAt))), + getVisibility() ]); const entries: { path: string; lastmod?: string }[] = [ - ...staticPaths.map((path) => ({ path })), + ...staticPaths + .filter((path) => moviesVisibility === 'public' || path !== '/trackers/movies') + .map((path) => ({ path })), ...races.map((race) => ({ path: `/projects/derby/${race.slug}` })), ...articles.map((article) => ({ path: `/blog/${encodeURIComponent(article.slug)}`, diff --git a/src/routes/start/+page.svelte b/src/routes/start/+page.svelte index d349981..82c0508 100644 --- a/src/routes/start/+page.svelte +++ b/src/routes/start/+page.svelte @@ -41,7 +41,7 @@ // Same list, order and icons as the header Trackers dropdown (owner-only ones only when // the header shows them). Spotting is a group tile with one-click chips per sub-tracker. - const trackers = $derived(visibleTrackers(data.isOwner, data.inactiveGames)); + const trackers = $derived(visibleTrackers(data.isOwner, data.inactiveGames, data.hiddenTrackers)); // Search-only shortcuts that aren't trackers of their own. const extraHits = [ { name: 'Weigh-in', href: '/trackers/health#body' }, diff --git a/src/routes/trackers/+page.svelte b/src/routes/trackers/+page.svelte index 1376cfd..76f1609 100644 --- a/src/routes/trackers/+page.svelte +++ b/src/routes/trackers/+page.svelte @@ -10,5 +10,9 @@

Personal data I keep track of: games, money, houses, books, prices, animals and lists.

- + diff --git a/src/routes/trackers/movies/+page.server.ts b/src/routes/trackers/movies/+page.server.ts new file mode 100644 index 0000000..0d2cc5a --- /dev/null +++ b/src/routes/trackers/movies/+page.server.ts @@ -0,0 +1,52 @@ +import { error, fail } from '@sveltejs/kit'; +import { isOwner, requireOwner } from '#lib/server/owner.js'; +import { + addTitle, + deleteRec, + deleteTitle, + getVisibility, + loadRecs, + loadStats, + loadTitles, + setVisibility, + updateTitle +} from '#lib/server/movies/site.js'; +import type { Actions, PageServerLoad } from './$types'; + +// Movies & TV: public by default; the owner's visibility switch can make it owner-only. +export const load: PageServerLoad = async (event) => { + const owner = isOwner(event); + const visibility = await getVisibility(); + if (visibility === 'private' && !owner) error(404, 'Not found'); + if (owner) event.setHeaders({ 'cache-control': 'private, no-store' }); + const [titles, stats, recs] = await Promise.all([loadTitles(), loadStats(), loadRecs()]); + return { + owner, + visibility, + titles, + stats, + recs, + seo: { + title: 'Movies & TV tracker', + description: + 'The movies and TV shows we watch: what we are watching, ratings, rewatches and stats per month, genre and platform.' + } + }; +}; + +type Result = { ok: true; id?: number } | { ok: false; message: string }; +const run = + (fn: (form: FormData) => Promise) => async (event: Parameters[0]) => { + requireOwner(event); + const res = await fn(await event.request.formData()); + if (!res.ok) return fail(400, { message: res.message }); + return res; + }; + +export const actions: Actions = { + update: run(updateTitle), + add: run(addTitle), + delete: run(deleteTitle), + deleteRec: run(deleteRec), + visibility: run(setVisibility) +}; diff --git a/src/routes/trackers/movies/+page.svelte b/src/routes/trackers/movies/+page.svelte new file mode 100644 index 0000000..397f905 --- /dev/null +++ b/src/routes/trackers/movies/+page.svelte @@ -0,0 +1,1529 @@ + + +
+
+
+ +
+

+ movies {#if data.visibility === 'private'}{/if} +

+

Movies and TV shows Juhee and I watch, from Netflix, Plex and the cinema.

+
+
+ +
+ +
+
+ {data.stats.totals.movies} movies +
+
{data.stats.totals.shows} shows
+
+ {data.stats.totals.episodes.toLocaleString('en-GB')} + episodes +
+
+ {hours(data.stats.totals.minutes)} hours +
+
+ + + + {#if form?.message}{/if} + + {#if tab === 'library'} + {#if data.titles.length === 0} +
+ +

Nothing here yet. Netflix, Plex and Letterboxd history is on its way.

+
+ {:else} +
+
+ {#each ['all', ...STATUSES] as s (s)} + + {/each} +
+
+ + + + +
+
+ + {#if filtered.length === 0} +

No titles match.

+ {:else} +
    + {#each filtered.slice(0, limit) as t (t.id)} + {@const p = progress(t)} +
  • + +
  • + {/each} +
+ {#if filtered.length > limit} + + {/if} + {/if} + {/if} + {:else if tab === 'stats'} + {#if data.stats.totals.plays === 0} +
+ +

Stats appear once there is watch history.

+
+ {:else} +
+
+

hours per month last 24 months

+
+ {#each recentMonths as m (m.month)} +
+ + + + + {monthLabel(m.month).slice(0, 1)} +
+ {/each} +
+

+ movies episodes +

+
+
+

per year

+
    + {#each data.stats.years.toReversed() as y (y.year)} +
  • + {y.year} + + {hours(y.minutes)} h · {y.movies} 🎬 · {y.episodes} 📺 +
  • + {/each} +
+
+
+

top genres

+ {#if data.stats.genres.length} +
    + {#each data.stats.genres as g (g.genre)} +
  • + {g.genre} + + {g.titles} +
  • + {/each} +
+ {:else} +

Genres come from TMDB once titles are matched.

+ {/if} +
+
+

who watched

+
+ {#each data.stats.who as w (w.who)} + + {/each} +
+
    + {#each data.stats.who as w (w.who)} +
  • + {whoLabel[w.who] ?? w.who} + {hours(w.minutes)} h + {Math.round((w.minutes / whoTotal) * 100)}% +
  • + {/each} +
+
+
+

platforms

+
+ {#each data.stats.platforms as p (p.platform)} + + {/each} +
+
    + {#each data.stats.platforms as p (p.platform)} +
  • + {p.platform} + {hours(p.minutes)} h + {Math.round((p.minutes / platformTotal) * 100)}% +
  • + {/each} +
+
+
+ {/if} + {:else} + {#if data.recs.length === 0} +
+ +

Ju has not recommended anything yet.

+
+ {:else} +
    + {#each data.recs as r (r.id)} +
  • + + {#if poster(r.posterPath)} + + {:else} + {r.title} + {/if} + +
    +

    + {r.title}{#if r.year} + {r.year}{/if} +

    +

    + for {whoLabel[r.forWhom] ?? r.forWhom} + {r.type} + {#if r.genres.length}{r.genres.slice(0, 2).join(', ')}{/if} +

    + {#if r.reason}

    {r.reason}

    {/if} +
    + {#if data.owner} +
    + + +
    + {/if} +
  • + {/each} +
+ {/if} + {/if} + +
+ TMDB + This product uses the TMDB API but is not endorsed or certified by TMDB. +
+
+ + (selectedId = null)}> + {#if selected} +
+ + {#if poster(selected.posterPath)} + + {:else} + {selected.title} + {/if} + +
+

+ {selected.title}{#if selected.year} + {selected.year}{/if} +

+

+ {selected.status} + {selected.type} + {#if selected.runtimeMin}{selected.runtimeMin} min{/if} + {#if selected.rating}{selected.rating}{/if} + {#if selected.watchedBy}{whoLabel[selected.watchedBy]}{/if} + {#if selected.platform}{selected.platform}{/if} +

+ {#if selected.genres.length}

{selected.genres.join(' · ')}

{/if} + {#if selected.lastWatched} +

+ {#if selected.firstWatched && selected.firstWatched !== selected.lastWatched} + {fmtDate(selected.firstWatched)} → {fmtDate(selected.lastWatched)} + {:else} + watched {fmtDate(selected.lastWatched)} + {/if} + {#if selected.rewatchCount} + · rewatched {selected.rewatchCount}×{/if} +

+ {/if} +
+ +
+ {#if selected.overview}

{selected.overview}

{/if} + {#if selected.cast.length}

+ cast + {selected.cast.slice(0, 8).join(', ')} +

{/if} + {#if selected.type === 'show' && selected.episodesWatched} +
+

+ {selected.episodesWatched} episodes watched{#if selected.totalEpisodes} + of {selected.totalEpisodes}{/if} +

+
    + {#each selected.seasons as s (s.season)} +
  • {s.season ? `S${s.season}` : 'other'} {s.watched}
  • + {/each} +
+
+ {/if} + {#if selected.notes}

{selected.notes}

{/if} + {#if data.owner} +
{ + busy = true; + return saveEnhance(); + }} + > + + + + + + + +
+ + + sources: {selected.sources.join(', ') || selected.source} +
+
+ {/if} + {/if} +
+ +{#if data.owner} + +
+

add a movie or show

+ +
+
{ + busy = true; + return addEnhance(); + }} + > + + + + + + + + +
+
+
+{/if} + + diff --git a/static/movies/tmdb-logo.svg b/static/movies/tmdb-logo.svg new file mode 100644 index 0000000..4b21ded --- /dev/null +++ b/static/movies/tmdb-logo.svg @@ -0,0 +1 @@ +Asset 3 \ No newline at end of file