Skip to content

seporaitis/mysqlparse

Folders and files

NameName
Last commit message
Last commit date
Aug 2, 2017
Sep 16, 2017
Sep 16, 2017
Feb 12, 2016
Sep 16, 2017
Feb 15, 2016
Jun 30, 2017
Aug 2, 2017
Aug 23, 2016
Feb 26, 2016
Jul 1, 2017
Jul 1, 2017
Feb 12, 2016
Jul 1, 2017
Sep 29, 2016
Sep 16, 2017
Sep 16, 2017

Repository files navigation

mysqlparse

https://readthedocs.org/projects/mysqlparse/badge/?version=latest

A highly experimental attempt to have a sane parser library to parse MySQL statements.

At the moment - use it at your own risk!

Features

  • Parses SOME SQL strings.

Example

Some properties that can be accessed.

>>> import mysqlparse
>>> sql = mysqlparse.parse("""
...     ALTER TABLE `django_user` ADD COLUMN `notes` LONGTEXT NOT NULL
... """)
>>> print(sql.statements[0].statement_type)
ALTER
>>> print(sql.statements[0].table_name)
`django_user`
>>> print(sql.statements[0].ignore)
False
>>> print(sql.statements[0].alter_specification[0].alter_action)
ADD COLUMN
>>> print(sql.statements[0].alter_specification[0].column_name)
`notes`
>>> print(sql.statements[0].alter_specification[0].data_type)
LONGTEXT
>>> print(sql.statements[0].alter_specification[0].null)
False
>>> print(sql.statements[0].alter_specification[0].column_position)
LAST

Checking that the alter statement is backwards compatible with a previous version of SOME code, which does not know how to save notes as NOT NULL:

for statement in sql.statements:
    if statement != 'ALTER':
        continue
    for column in statement.alter_specification:
        if column.data_type == 'LONGTEXT':
            if column.null is False and column.default != 'NULL':
                print "{s.table_name}.{c.column_name} is `LONGTEXT NOT NULL` which may break the production system. Use `LONGTEXT DEFAULT NULL` instead.".format(
                    s=statement,
                    c=column,
                )

How can you help?

A short list of things that would help (from relatively easiest):

  • Raise an issue with an edge case statement that should parse, but doesn't.
  • Raise an issue with how you would like to use this library.
  • Document the available properties in the parsed object.
  • Add a missing test case or suggest a way to avoid so much repetition in tests checking the same statement, but with variations.
  • Suggest how to use pyparsing to do statement validation.
  • Maybe it is possible to generate pyparsing parser from the MySQL source code?
  • Add ability to unparse the parse (sub)trees back into valid SQL.

Why?

Out of frustration for lack of a better tool.