Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python
- """
- This script, despite its name (sorry for a little confusion)
- does not actually perform any imports. It just generates a set
- of sql statements that, when fed to an appropriate sql shell
- will perform the export.
- Note, that it does not support bulk insert (yet)
- It is meant to be used as an input for aforementioned shell command
- """
- from optparse import OptionParser
- from lxml import etree
- import sys
- reload(sys)
- sys.setdefaultencoding('utf-8')
- parser = OptionParser()
- parser.add_option('-i', '--input',
- dest = "input",
- help = "Name of the input XML file",
- metavar = "FILENAME",
- )
- parser.add_option('-o', '--output',
- dest = "output",
- help = "Name of the output file to use. By default the output is written to stdout",
- metavar = "FILENAME",
- )
- parser.add_option('-t', '--table',
- dest = "table",
- help = "Name of the table, on which to perform insert operations",
- metavar = "TABLENAME")
- opts, args = parser.parse_args()
- if not opts.input:
- raise "The name of the input file is a mandatory argument"
- # Make the value SQL-type friendly :) This is a heuristic
- def sqlize(val):
- # 0. None -- make it a NULL
- if val is None:
- return 'NULL'
- # 1. Number? -- Leave as it is
- try:
- float(val)
- return val
- except ValueError:
- # 2. String? -- quote
- return "'%s'" % unicode(val.replace("'", "\\'"))
- resfile = sys.stdout
- if opts.output is not None:
- resfile = file(opts.output, 'w')
- root = etree.parse(opts.input).getroot()
- for row in root.iter('row'):
- f_name_list = [f.attrib['name'] for f in row]
- f_val_list = [f.text for f in row]
- resfile.write("INSERT INTO %s(%s) values(%s);\n" % (opts.table, ', '.join(f_name_list), ', '.join([sqlize(v) for v in f_val_list])))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement