diff --git a/target_postgres/db_sync.py b/target_postgres/db_sync.py index 4df4a8c..0d563d0 100644 --- a/target_postgres/db_sync.py +++ b/target_postgres/db_sync.py @@ -182,6 +182,8 @@ def stream_name_to_dict(stream_name, separator='-'): def csv_quote(s): + if s is None: + return "" if isinstance(s, int): return str(s) return '"' + str(s).replace("\\", "\\\\").replace('"', '\\"') + '"' @@ -353,11 +355,7 @@ def record_primary_key_string(self, record): def record_to_csv_line(self, record): flatten = flatten_record(record, self.flatten_schema, max_level=self.data_flattening_max_level) return ','.join( - [ - csv_quote(flatten[name]) - if name in flatten and (flatten[name] == 0 or flatten[name]) else '' - for name in self.flatten_schema - ] + csv_quote(flatten.get(name)) for name in self.flatten_schema ) def load_csv(self, file, count, size_bytes): diff --git a/tests/unit/test_db_sync.py b/tests/unit/test_db_sync.py index 143756f..b78d1a6 100644 --- a/tests/unit/test_db_sync.py +++ b/tests/unit/test_db_sync.py @@ -355,6 +355,26 @@ def test_record_to_csv_line(self): }, '1,"some \\"quotes\\" and \\\\backslashes\\\\",555', ), + ( + { + "c_pk": 1, + "c_varchar": "", + "c_int": 2, + }, + '1,"",2', + ), + ( + { + "c_pk": 1, + "c_varchar": None, + "c_int": 2, + }, + '1,,2', + ), + ( + {}, + ',,', + ), ] for idx, (record, expected_output) in enumerate(test_cases):