SQL to load at least to PostgreSQL or SQLite.
The program is in the early stage of development and currently cannot do much.
-It removes /\*! directives \*/, unescapes strings and passes everything else
-unmodified.
+It removes /\*! directives \*/, unescapes strings and escapes them to a
+different quoting style, and passes everything else unmodified.
.. highlight:: none
Usage::
- mysql2sql [-e encoding] [-E output_encoding] [infile] [[-o] outfile]
+ mysql2sql [-e encoding] [-E output_encoding] [-m/-p/-s] [infile] [[-o] outfile]
Options::
separate output encoding, default is the same as
`-e` except for console; for console output charset
from the current locale is used
+ -m, --mysql MySQL/MariaDB quoting style
+ -p, --pg, --postgres PostgreSQL quoting style
+ -s, --sqlite Generic SQL/SQLite quoting style (default)
-P, --no-pbar Inhibit progress bar
infile Input file, stdin if absent or '-'
-o, --outfile outfile Output file, stdout if absent or '-'
+Options `-m/-p/-s` change quoting style. `-m` sets MySQL quoting style; it's
+added to use the program in the following scenario: convert MySQL dumps with
+extended INSERTs to SQL with plain INSERTS suitable to be fed back to MySQL.
+`-p` sets PostgreSQL quoting style; it's like MySQL with additional `E''-style
+quoting
+<https://www.postgresql.org/docs/9.1/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE>`_.
+`-s` sets generic SQL/SQLite quoting style; this is the default.
+
If stderr is connected to the console the program displays a text mode progress
bar. Option `-P/--no-pbar` inhibits it.
return size
-def main(infile, encoding, outfile, output_encoding, use_pbar):
+def main(infile, encoding, outfile, output_encoding, use_pbar, quoting_style):
if use_pbar:
size = get_fsize(infile)
if size is None:
got_directive = is_directive_statement(statement)
if got_directive:
continue
- process_statement(statement)
+ process_statement(statement, quoting_style)
print_tokens(statement, outfile=outfile,
encoding=output_encoding)
tokens = grouper.close()
help='separate output encoding, default is the same '
'as -e except for console; for console output '
'charset from the current locale is used')
+ parser.add_argument('-m', '--mysql', action='store_true',
+ help='MySQL/MariaDB quoting style')
+ parser.add_argument('-p', '--pg', '--postgres', action='store_true',
+ help='PostgreSQL quoting style')
+ parser.add_argument('-s', '--sqlite', action='store_true',
+ help='Generic SQL/SQLite quoting style; '
+ 'this is the default')
parser.add_argument('-o', '--outfile', help='output file name')
parser.add_argument('-P', '--no-pbar', action='store_true',
help='inhibit progress bar')
parser.add_argument('output_file', nargs='?', help='output file name')
args = parser.parse_args()
+ if int(args.mysql) + int(args.postgres) + int(args.sqlite) > 1:
+ print("Error: options -m/-p/-s are mutually incompatible, "
+ "use only one of them",
+ file=sys.stderr)
+ parser.print_help()
+ sys.exit(1)
+
if args.infile:
if args.infile == '-':
infile = sys.stdin
infile.close()
raise
- main(infile, args.encoding, outfile, output_encoding, not args.no_pbar)
+ if args.mysql:
+ quoting_style = 'mysql'
+ elif args.postgres:
+ quoting_style = 'postgres'
+ else:
+ quoting_style = 'sqlite'
+
+ main(infile, args.encoding, outfile, output_encoding, not args.no_pbar,
+ quoting_style)
from sqlparse.sql import Comment
from sqlparse import tokens as T
+from .process_tokens import escape_strings
def _is_directive_token(token):
token.normalized = token.value = value
-def process_statement(statement):
+def process_statement(statement, quoting_style='sqlite'):
remove_directive_tokens(statement)
requote_names(statement)
unescape_strings(statement)
+ escape_strings(statement, quoting_style)