diff --git a/game-runtime/tools/newapi_pool_provision.py b/game-runtime/tools/newapi_pool_provision.py index afc88704..c8a4c67c 100644 --- a/game-runtime/tools/newapi_pool_provision.py +++ b/game-runtime/tools/newapi_pool_provision.py @@ -104,7 +104,8 @@ class Postgres: def _run(self, sql: str, operation: str = "query") -> str: """执行一条 SQL,返回 tuples-only、unaligned、以 | 分隔的原始 stdout。失败即抛。""" cmd = [ - "docker", "exec", + # SQL 只经 stdin 传输;docker exec 必须带 -i,否则会静默执行空输入并返回成功。 + "docker", "exec", "-i", "-e", f"PGPASSWORD={self._password}", PG_CONTAINER, "psql", "-U", PG_USER, "-d", PG_DB, diff --git a/game-runtime/tools/test_newapi_pool_provision.py b/game-runtime/tools/test_newapi_pool_provision.py index 00bf1460..7c005309 100755 --- a/game-runtime/tools/test_newapi_pool_provision.py +++ b/game-runtime/tools/test_newapi_pool_provision.py @@ -74,6 +74,16 @@ class ProvisionRequestTest(unittest.TestCase): self.assertEqual(query.call_count, 3) self.assertEqual(sleep.call_count, 2) + def test_postgres_attaches_sql_stdin_to_docker_exec(self) -> None: + completed = mock.Mock(returncode=0, stdout="67\n", stderr="") + with mock.patch.object(MODULE.subprocess, "run", return_value=completed) as run: + uid = MODULE.Postgres("secret").query_user_id("neice_051") + self.assertEqual(uid, 67) + command = run.call_args.args[0] + self.assertIn("-i", command) + self.assertEqual(run.call_args.kwargs["input"], + "SELECT id FROM users WHERE username='neice_051';") + if __name__ == "__main__": unittest.main()