Skip to content

Commit 9f7e397

Browse files
authored
Allow CLI override PostgreSQL connection settings (#24)
1 parent 8102387 commit 9f7e397

File tree

1 file changed

+114
-46
lines changed

1 file changed

+114
-46
lines changed

src/pgcachewatch/cli.py

Lines changed: 114 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import argparse
2+
import os
23
import sys
34

45
import asyncpg
@@ -38,6 +39,63 @@ def cliparser() -> argparse.Namespace:
3839
help="Commit changes to database.",
3940
)
4041

42+
common_arguments.add_argument(
43+
"--pg-dsn",
44+
help=(
45+
"Connection string in the libpq URI format, including host, port, user, "
46+
"database, password, passfile, and SSL options. Must be properly quoted; "
47+
"IPv6 addresses must be in brackets. "
48+
"Example: postgres://user:pass@host:port/database. Defaults to PGDSN "
49+
"environment variable if set."
50+
),
51+
default=os.environ.get("PGDSN"),
52+
)
53+
54+
common_arguments.add_argument(
55+
"--pg-host",
56+
help=(
57+
"Database host address, which can be an IP or domain name. "
58+
"Defaults to PGHOST environment variable if set."
59+
),
60+
default=os.environ.get("PGHOST"),
61+
)
62+
63+
common_arguments.add_argument(
64+
"--pg-port",
65+
help=(
66+
"Port number for the server host Defaults to PGPORT environment variable "
67+
"or 5432 if not set."
68+
),
69+
default=os.environ.get("PGPORT", "5432"),
70+
)
71+
72+
common_arguments.add_argument(
73+
"--pg-user",
74+
help=(
75+
"Database role for authentication. Defaults to PGUSER environment "
76+
"variable if set."
77+
),
78+
default=os.environ.get("PGUSER"),
79+
)
80+
81+
common_arguments.add_argument(
82+
"--pg-database",
83+
help=(
84+
"Name of the database to connect to. Defaults to PGDATABASE environment "
85+
"variable if set."
86+
),
87+
default=os.environ.get("PGDATABASE"),
88+
)
89+
90+
common_arguments.add_argument(
91+
"--pg-password",
92+
help=(
93+
"Password for authentication. Defaults to PGPASSWORD "
94+
"environment variable if set"
95+
),
96+
default=os.environ.get("PGPASSWORD"),
97+
)
98+
4199
parser = argparse.ArgumentParser(
42100
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
43101
prog="pgcachewatch",
@@ -67,53 +125,63 @@ async def main() -> None:
67125
pg_fn_name = f"{parsed.function_name}_{parsed.channel_name}"
68126
pg_tg_name = f"{parsed.trigger_name}_{parsed.channel_name}"
69127

70-
match parsed.command:
71-
case "install":
72-
install = "\n".join(
73-
[
74-
queries.create_notify_function(
75-
channel_name=parsed.channel_name,
76-
function_name=pg_fn_name,
77-
)
78-
]
79-
+ [
80-
queries.create_after_change_trigger(
81-
trigger_name=pg_tg_name,
82-
table_name=table,
83-
function_name=pg_fn_name,
84-
)
85-
for table in parsed.tables
86-
]
87-
)
88-
89-
print(install, flush=True)
90-
91-
if parsed.commit:
92-
await (await asyncpg.connect()).execute(install)
93-
else:
94-
print(
95-
"::: Use '--commit' to write changes to db. :::",
96-
file=sys.stderr,
128+
async with asyncpg.create_pool(
129+
parsed.pg_dsn,
130+
database=parsed.pg_database,
131+
password=parsed.pg_password,
132+
port=parsed.pg_port,
133+
user=parsed.pg_user,
134+
host=parsed.pg_host,
135+
min_size=0,
136+
max_size=1,
137+
) as pool:
138+
match parsed.command:
139+
case "install":
140+
install = "\n".join(
141+
[
142+
queries.create_notify_function(
143+
channel_name=parsed.channel_name,
144+
function_name=pg_fn_name,
145+
)
146+
]
147+
+ [
148+
queries.create_after_change_trigger(
149+
trigger_name=pg_tg_name,
150+
table_name=table,
151+
function_name=pg_fn_name,
152+
)
153+
for table in parsed.tables
154+
]
97155
)
98156

99-
case "uninstall":
100-
trigger_names = await (await asyncpg.connect()).fetch(
101-
queries.fetch_trigger_names(pg_tg_name),
102-
)
103-
combined = "\n".join(
104-
(
105-
"\n".join(
106-
queries.drop_trigger(t["trigger_name"], t["table"])
107-
for t in trigger_names
108-
),
109-
queries.drop_function(pg_fn_name),
157+
print(install, flush=True)
158+
159+
if parsed.commit:
160+
await pool.execute(install)
161+
else:
162+
print(
163+
"::: Use '--commit' to write changes to db. :::",
164+
file=sys.stderr,
165+
)
166+
167+
case "uninstall":
168+
trigger_names = await pool.fetch(
169+
queries.fetch_trigger_names(pg_tg_name),
110170
)
111-
)
112-
print(combined, flush=True)
113-
if parsed.commit:
114-
await (await asyncpg.connect()).execute(combined)
115-
else:
116-
print(
117-
"::: Use '--commit' to write changes to db. :::",
118-
file=sys.stderr,
171+
combined = "\n".join(
172+
(
173+
"\n".join(
174+
queries.drop_trigger(t["trigger_name"], t["table"])
175+
for t in trigger_names
176+
),
177+
queries.drop_function(pg_fn_name),
178+
)
119179
)
180+
print(combined, flush=True)
181+
if parsed.commit:
182+
await pool.execute(combined)
183+
else:
184+
print(
185+
"::: Use '--commit' to write changes to db. :::",
186+
file=sys.stderr,
187+
)

0 commit comments

Comments
 (0)