builtbykev
a011ae79fe
Statcast: role belongs in the key (two-way players)
...
Found by inducing the real job on the server, not by review: the first chunk
wrote, the second failed with 'ON CONFLICT DO UPDATE command cannot affect row
a second time'. A player can legitimately appear in BOTH the batter and the
pitcher feeds — two-way players, position players who pitch, pitchers who bat —
so (sport, season, source_id) collapsed two real profiles into one key and a
single batch hit the same row twice.
Ohtani has a real batter profile and a real pitcher profile. Merging them would
invent one player out of two genuinely different sets of measurements, so role
goes in the primary key rather than one profile winning. Migration 031 applied;
conflict target updated; a two-way case is now a test.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01VCNgGSt5qvcLxaeQqa7Zpj
2026-07-20 21:49:53 -04:00
..
2026-06-08 18:35:13 -04:00
2026-06-11 03:48:07 -04:00
2026-03-21 14:21:34 -04:00
2026-06-10 13:24:11 -04:00
2026-07-10 21:34:26 -04:00
2026-07-10 21:34:26 -04:00
2026-06-10 19:41:37 -04:00
2026-07-16 17:01:48 -04:00
2026-06-18 20:15:38 -04:00
2026-07-12 23:41:13 -04:00
2026-07-20 11:31:48 -04:00
2026-07-20 01:10:23 -04:00
2026-07-19 22:27:58 -04:00
2026-07-13 03:48:58 -04:00
2026-06-13 12:37:08 -04:00
2026-07-11 14:28:18 -04:00
2026-07-11 14:28:18 -04:00
2026-07-18 13:55:39 -04:00
2026-07-12 13:42:18 -04:00
2026-03-21 14:21:34 -04:00
2026-06-08 18:35:13 -04:00
2026-07-20 12:27:47 -04:00
2026-07-20 13:37:52 -04:00
2026-07-20 13:58:47 -04:00
2026-07-20 13:37:52 -04:00
2026-06-08 18:35:13 -04:00
2026-07-18 01:29:55 -04:00
2026-07-13 16:58:22 -04:00
2026-07-13 16:58:22 -04:00
2026-07-13 16:58:22 -04:00
2026-07-18 01:52:37 -04:00
2026-07-20 03:50:07 -04:00
2026-07-19 18:54:51 -04:00
2026-06-08 18:35:13 -04:00
2026-06-13 21:30:57 -04:00
2026-06-13 21:30:57 -04:00
2026-06-08 18:35:13 -04:00
2026-06-08 18:35:13 -04:00
2026-03-21 12:45:15 -04:00
2026-06-18 20:15:38 -04:00
2026-06-18 20:15:38 -04:00
2026-07-18 01:42:16 -04:00
2026-07-19 02:43:30 -04:00
2026-07-20 13:17:34 -04:00
2026-07-12 19:25:32 -04:00
2026-07-13 00:07:06 -04:00
2026-07-20 17:05:04 -04:00
2026-07-17 15:26:49 -04:00
2026-07-17 01:34:01 -04:00
2026-07-10 20:17:49 -04:00
2026-06-08 18:35:13 -04:00
2026-06-08 18:35:13 -04:00
2026-07-20 17:05:04 -04:00
2026-07-13 11:44:15 -04:00
2026-07-13 18:44:57 -04:00
2026-07-13 18:12:31 -04:00
2026-07-14 00:21:59 -04:00
2026-07-13 13:18:59 -04:00
2026-07-13 18:12:31 -04:00
2026-07-11 00:47:01 -04:00
2026-06-08 18:35:13 -04:00
2026-07-13 18:44:57 -04:00
2026-06-10 19:41:37 -04:00
2026-06-10 14:50:13 -04:00
2026-06-08 18:35:13 -04:00
2026-07-16 11:26:00 -04:00
2026-07-13 23:27:19 -04:00
2026-07-13 23:33:26 -04:00
2026-07-20 03:25:01 -04:00
2026-06-10 19:41:37 -04:00
2026-06-10 03:37:07 -04:00
2026-07-19 18:54:51 -04:00
2026-07-13 14:36:28 -04:00
2026-06-15 18:21:32 -04:00
2026-06-08 18:35:13 -04:00
2026-07-13 13:18:59 -04:00
2026-06-08 18:35:13 -04:00
2026-07-19 02:43:30 -04:00
2026-06-08 18:35:13 -04:00
2026-06-12 11:16:58 -04:00
2026-07-17 03:15:50 -04:00
2026-06-10 22:24:40 -04:00
2026-06-08 18:35:13 -04:00
2026-06-08 18:35:13 -04:00
2026-06-10 20:45:05 -04:00
2026-07-11 20:08:24 -04:00
2026-03-21 11:41:18 -04:00
2026-06-18 20:15:38 -04:00
2026-07-11 20:08:24 -04:00
2026-07-17 16:08:18 -04:00
2026-07-20 05:41:41 -04:00
2026-03-21 14:21:34 -04:00
2026-06-08 18:35:13 -04:00
2026-06-13 12:37:08 -04:00
2026-07-12 00:45:29 -04:00
2026-07-12 00:45:29 -04:00
2026-07-13 14:59:44 -04:00
2026-07-11 14:31:35 -04:00
2026-03-21 14:21:34 -04:00
2026-06-08 18:35:13 -04:00
2026-06-11 16:21:18 -04:00
2026-07-17 03:06:12 -04:00
2026-06-19 01:45:36 -04:00
2026-06-18 23:56:26 -04:00
2026-07-13 03:48:58 -04:00
2026-07-11 00:59:17 -04:00
2026-06-19 15:45:07 -04:00
2026-06-19 10:20:55 -04:00
2026-06-19 02:42:13 -04:00
2026-06-18 15:38:06 -04:00
2026-07-17 03:15:50 -04:00
2026-07-11 14:29:22 -04:00
2026-07-13 23:33:26 -04:00
2026-07-13 23:27:19 -04:00
2026-06-15 18:21:32 -04:00
2026-06-10 03:37:07 -04:00
2026-03-22 05:11:42 -04:00
2026-06-08 18:35:13 -04:00
2026-07-13 16:58:22 -04:00
2026-07-13 23:33:26 -04:00
2026-06-08 18:35:13 -04:00
2026-06-12 02:41:51 -04:00
2026-06-14 22:29:01 -04:00
2026-06-12 02:41:51 -04:00
2026-06-19 10:20:55 -04:00
2026-06-08 18:35:13 -04:00
2026-07-20 12:27:47 -04:00
2026-07-11 14:34:45 -04:00
2026-07-20 11:31:48 -04:00
2026-07-10 17:00:29 -04:00
2026-07-13 14:59:44 -04:00
2026-06-11 16:21:18 -04:00
2026-06-11 16:21:18 -04:00
2026-06-12 02:06:22 -04:00
2026-06-19 15:45:07 -04:00
2026-03-21 12:45:15 -04:00
2026-07-13 14:36:28 -04:00
2026-06-19 11:25:14 -04:00
2026-06-10 09:28:30 -04:00
2026-06-13 12:37:08 -04:00
2026-07-11 14:28:18 -04:00
2026-07-11 14:28:18 -04:00
2026-06-08 18:35:13 -04:00
2026-03-22 05:11:42 -04:00
2026-03-22 05:11:42 -04:00
2026-07-10 17:00:29 -04:00
2026-07-10 22:24:47 -04:00
2026-07-13 16:02:16 -04:00
2026-07-17 01:07:28 -04:00
2026-06-18 20:15:38 -04:00
2026-07-20 17:05:04 -04:00
2026-06-18 20:15:38 -04:00
2026-06-19 01:45:36 -04:00
2026-06-18 23:56:26 -04:00
2026-06-18 20:15:38 -04:00
2026-06-08 18:35:13 -04:00
2026-06-08 18:35:13 -04:00
2026-07-20 19:56:21 -04:00
2026-06-08 18:35:13 -04:00
2026-06-18 23:56:26 -04:00
2026-06-19 02:42:13 -04:00
2026-07-11 14:24:41 -04:00
2026-06-14 22:29:01 -04:00
2026-06-08 18:35:13 -04:00
2026-07-11 19:38:37 -04:00
2026-07-15 18:07:14 -04:00
2026-06-12 11:16:58 -04:00
2026-07-20 17:05:04 -04:00
2026-06-13 10:57:49 -04:00
2026-07-15 18:07:14 -04:00
2026-07-19 02:09:11 -04:00
2026-06-08 18:35:13 -04:00
2026-06-10 03:12:20 -04:00
2026-06-10 01:22:55 -04:00
2026-06-11 21:22:59 -04:00
2026-07-20 02:00:40 -04:00
2026-06-08 18:35:13 -04:00
2026-06-12 17:58:55 -04:00
2026-07-16 21:27:47 -04:00
2026-07-13 16:02:16 -04:00
2026-07-12 19:25:32 -04:00
2026-07-11 14:24:41 -04:00
2026-03-21 10:58:58 -04:00
2026-06-08 18:35:13 -04:00
2026-07-11 20:08:24 -04:00
2026-06-08 18:35:13 -04:00
2026-06-10 20:45:05 -04:00
2026-06-18 11:12:24 -04:00
2026-06-18 15:38:06 -04:00
2026-06-18 20:15:38 -04:00
2026-07-19 00:19:23 -04:00
2026-07-20 05:41:41 -04:00
2026-06-08 18:35:13 -04:00
2026-06-08 18:35:13 -04:00
2026-06-08 18:35:13 -04:00
2026-06-08 18:35:13 -04:00
2026-06-08 18:35:13 -04:00
2026-06-08 18:35:13 -04:00
2026-03-21 11:41:18 -04:00
2026-06-08 18:35:13 -04:00
2026-07-11 14:28:18 -04:00
2026-07-10 22:24:47 -04:00
2026-06-18 20:15:38 -04:00
2026-07-11 19:32:17 -04:00
2026-07-20 19:52:00 -04:00
2026-07-17 15:26:49 -04:00
2026-06-19 13:55:39 -04:00
2026-07-17 15:26:49 -04:00
2026-06-10 14:50:13 -04:00
2026-06-10 20:45:05 -04:00
2026-06-10 14:50:13 -04:00
2026-06-16 14:37:07 -04:00
2026-06-10 14:50:13 -04:00
2026-06-11 18:15:25 -04:00
2026-06-19 14:25:05 -04:00
2026-07-15 18:07:14 -04:00
2026-07-13 16:58:22 -04:00
2026-06-08 18:35:13 -04:00
2026-06-12 15:45:19 -04:00
2026-07-17 01:42:03 -04:00
2026-07-20 21:49:53 -04:00
2026-06-12 11:16:58 -04:00
2026-06-08 18:35:13 -04:00
2026-06-18 11:12:24 -04:00
2026-07-11 00:39:18 -04:00
2026-06-12 11:16:58 -04:00
2026-07-18 23:04:19 -04:00
2026-06-08 18:35:13 -04:00
2026-07-11 14:34:45 -04:00
2026-06-11 10:06:49 -04:00
2026-06-12 11:16:58 -04:00
2026-06-10 19:41:37 -04:00
2026-06-11 16:21:18 -04:00
2026-07-13 00:31:35 -04:00
2026-06-19 15:45:07 -04:00
2026-06-08 18:35:13 -04:00
2026-07-19 20:31:15 -04:00
2026-07-17 15:26:49 -04:00
2026-06-18 21:34:29 -04:00
2026-06-10 13:24:11 -04:00
2026-07-13 13:58:01 -04:00
2026-07-11 14:24:41 -04:00
2026-06-08 18:35:13 -04:00
2026-06-10 14:50:13 -04:00
2026-03-21 12:45:15 -04:00
2026-07-19 02:43:30 -04:00
2026-07-17 15:26:49 -04:00
2026-07-10 20:17:49 -04:00
2026-07-11 14:31:53 -04:00
2026-07-16 16:19:30 -04:00
2026-07-17 15:26:49 -04:00
2026-07-17 15:26:49 -04:00
2026-06-16 01:04:37 -04:00
2026-07-10 20:17:49 -04:00
2026-06-11 16:21:18 -04:00
2026-06-08 18:35:13 -04:00
2026-06-08 18:35:13 -04:00
2026-06-10 14:50:13 -04:00