Skip to content

Commit daeb834

Browse files
committed
🐛 Add safe fks to light dump script
Previously the FK from FoiRequest to FoiProject made it that only requests which have a project were dumped. However we also want requests without a project to be dumped"
1 parent 702afc4 commit daeb834

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

scripts/create_light_sql.py

+18-3
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def get_join_list(table, schema, graph, filters, fk_sets):
8989
return join_list
9090

9191

92-
def get_copy_selects(schema, filters, safe_tables):
92+
def get_copy_selects(schema, filters, safe_tables, safe_fks):
9393
restricted_tables = set(filters.keys())
9494
controlled_tables = restricted_tables | safe_tables
9595

@@ -109,7 +109,10 @@ def get_copy_selects(schema, filters, safe_tables):
109109
filter_set |= {f"{b}.{f}" for f in filters.get(b, ())}
110110
filter_set |= {f"{a}.{f}" for f in filters.get(a, ())}
111111
for fk in fk_sets[(a, b)]:
112-
filter_set.add(f"{a}.{fk} = {b}.id")
112+
if (a, fk) in safe_fks:
113+
filter_set.add(f"({a}.{fk} = {b}.id OR {a}.{fk} IS NULL)")
114+
else:
115+
filter_set.add(f"{a}.{fk} = {b}.id")
113116

114117
tables = list(join_tables | {table})
115118
else:
@@ -137,6 +140,7 @@ def generate_copy_script(
137140
target_connection="",
138141
target_owner="fragdenstaat_de",
139142
safe_tables="safe_tables.txt",
143+
safe_fks="safe_fks.txt",
140144
schema_file="schema.sql",
141145
):
142146
FILTERS = dict(
@@ -171,6 +175,15 @@ def generate_copy_script(
171175
["public.{}".format(x.strip()) for x in f.readlines() if x.strip()]
172176
)
173177

178+
with open(safe_fks) as f:
179+
safe_fks = set(
180+
[
181+
("public.{}".format(x.split()[0].strip()), x.split()[1].strip())
182+
for x in f.readlines()
183+
if x.strip()
184+
]
185+
)
186+
174187
with open(schema_file) as f:
175188
schema = f.read()
176189
all_tables = set(TABLE_RE.findall(schema))
@@ -203,7 +216,7 @@ def generate_copy_script(
203216
outfile.write(f"psql {target_connection} {target_db} < table_setup.sql\n")
204217

205218
outfile.write(f"export PGPASSWORD='{source_password}'\n")
206-
for table, select in get_copy_selects(schema, FILTERS, safe_tables):
219+
for table, select in get_copy_selects(schema, FILTERS, safe_tables, safe_fks):
207220
outfile.write(f'echo "Copying {table}"\n')
208221
cmd = f"""psql -c "COPY ({select}) TO STDOUT;" {source_connection} {source_db} | psql -c "COPY {table} FROM STDIN;" {target_connection} {target_db}\n"""
209222
outfile.write(cmd)
@@ -254,6 +267,7 @@ def main():
254267
parser.add_argument(
255268
"--safe_tables", help="safe tables file", default="safe_tables.txt"
256269
)
270+
parser.add_argument("--safe_fks", help="safe fks file", default="safe_fks.txt")
257271
parser.add_argument(
258272
"--source_db",
259273
help="Postgres target connection details",
@@ -279,6 +293,7 @@ def main():
279293
generate_copy_script(
280294
sys.stdout,
281295
safe_tables=args.safe_tables,
296+
safe_fks=args.safe_fks,
282297
schema_file=args.schema_file,
283298
source_connection=args.source_connection,
284299
target_connection=args.target_connection,

scripts/safe_fks.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
foirequest_foirequest project_id

0 commit comments

Comments
 (0)