Source code for data_migrator.emitters.mysql

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

from data_migrator.emitters.base import BaseEmitter
from data_migrator.models.fields import HiddenField
from data_migrator.utils import sql_escape, default_logger

log = default_logger()


[docs]class MySQLEmitter(BaseEmitter): '''MySQL emitter to output MySQL specific insert statements Attributes: base_template: base template to output the object extension (str): file extension for output file of this emitter. Defaults to .sql ''' base_template = '''INSERT %sINTO `%s` (%s) VALUES (%s);''' extension = '.sql' def __init__(self, *args, **kwargs): super(MySQLEmitter, self).__init__(*args, **kwargs) self._prepare()
[docs] def emit(self, l): '''Output the result set of an object as MYSQL insert statement''' res = [] if hasattr(l, self.meta.remark): res.append("# %s" % getattr(l, self.meta.remark)) res.append(self._template % l.emit(escaper=sql_escape)) return res
[docs] def preamble(self, headers): '''override the preamble method to make it specific for MySQL''' # before we spit out the data _meta = self.meta h1 = [ "transformation for %s to table %s" % (_meta.model_name, _meta.table_name), "input headers: %s" % ",".join(headers), 'stats: %s' % ",".join(["%s=%d" % (k, v) for k, v in self.manager.stats().items()]), ] r = [] r += ['# %s' % l for l in h1] r += [""] if isinstance(_meta.prefix, list): r += ["%s" % l for l in _meta.prefix] else: r += [ "SET SQL_SAFE_UPDATES = 0; -- you need this to delete without WHERE clause", "DELETE FROM `%s`;" % _meta.table_name, #nosec "ALTER TABLE `%s` AUTO_INCREMENT = 1;" % _meta.table_name, ] r += [""] return r
def _prepare(self): # generate the base query template c = [f.name for k, f in self.meta.fields.items() if not isinstance(f, HiddenField)] columns = ", ".join(["`" + x + "`" for x in c]) replacements = ", ".join(["%(" + x + ")s" for x in c]) _ignore = 'IGNORE ' if self.meta.drop_non_unique else '' template = self.base_template % (_ignore, self.meta.table_name, columns, replacements) log.debug('emit template: %s', template) self._template = template