@@ -136,7 +136,7 @@ def insert(self, event_or_events):
136
136
if self .dst_table is None :
137
137
self .dst_table = event .table
138
138
139
- self .writer = csv .DictWriter (self .file , fieldnames = self .fieldnames , quoting = csv .QUOTE_ALL )
139
+ self .writer = csv .DictWriter (self .file , fieldnames = self .fieldnames , quoting = csv .QUOTE_NONNUMERIC )
140
140
if not self .header_written :
141
141
self .writer .writeheader ()
142
142
@@ -190,7 +190,7 @@ def delete_row(self, event_or_events):
190
190
if self .dst_table is None :
191
191
self .dst_table = event .table
192
192
193
- self .writer = csv .DictWriter (self .file , fieldnames = self .fieldnames , quoting = csv .QUOTE_ALL )
193
+ self .writer = csv .DictWriter (self .file , fieldnames = self .fieldnames , quoting = csv .QUOTE_NONNUMERIC )
194
194
if not self .header_written :
195
195
self .writer .writeheader ()
196
196
@@ -253,7 +253,7 @@ def update(self, event_or_events):
253
253
if self .dst_table is None :
254
254
self .dst_table = event .table
255
255
256
- self .writer = csv .DictWriter (self .file , fieldnames = self .fieldnames , quoting = csv .csv . QUOTE_ALL )
256
+ self .writer = csv .DictWriter (self .file , fieldnames = self .fieldnames , quoting = csv .QUOTE_NONNUMERIC )
257
257
if not self .header_written :
258
258
self .writer .writeheader ()
259
259
@@ -266,28 +266,34 @@ def update(self, event_or_events):
266
266
self .generate_row (event_converted )
267
267
268
268
269
+ def convert_null_values (self , row ):
270
+ """ We need to mark those fields that are null to be able to distinguish between NULL and empty strings """
271
+ for key in list (row .keys ()):
272
+ if row [key ] is None :
273
+ row [key ] = "NULL"
274
+
269
275
def generate_row (self , event ):
270
276
""" When using mempool or csvpool events are cached so you can receive different kind of events in the same list. These events should be handled in a different way """
271
277
272
278
if isinstance (event .pymysqlreplication_event , WriteRowsEvent ):
273
279
for row in event :
274
- # row['tb_upd'] = event.ts.strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
275
280
row ['tb_upd' ] = datetime .utcnow ().strftime ('%Y-%m-%d %H:%M:%S.%f' )
276
281
row ['operation' ] = 0
282
+ self .convert_null_values (row )
277
283
self .writer .writerow (self .convert (row ))
278
284
elif isinstance (event .pymysqlreplication_event , DeleteRowsEvent ):
279
285
for row in event :
280
- # row['tb_upd'] = event.ts.strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
281
286
row ['tb_upd' ] = datetime .utcnow ().strftime ('%Y-%m-%d %H:%M:%S.%f' )
282
287
row ['operation' ] = 2
288
+ self .convert_null_values (row )
283
289
self .writer .writerow (self .convert (row ))
284
290
elif isinstance (event .pymysqlreplication_event , UpdateRowsEvent ):
285
291
for row in event .pymysqlreplication_event .rows :
286
- # row['after_values']['tb_upd'] = event.ts.strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
287
292
row ['after_values' ]['tb_upd' ] = datetime .utcnow ().strftime ('%Y-%m-%d %H:%M:%S.%f' )
288
293
row ['after_values' ]['operation' ] = 1
294
+ self .convert_null_values (row ['after_values' ])
289
295
self .writer .writerow (self .convert (row ['after_values' ]))
290
-
296
+
291
297
292
298
def push (self ):
293
299
if not self .next_writer_builder or not self .fieldnames :
0 commit comments