针对数据库验证MySQL的最快方法

时间:2016-01-19 05:30:40

标签: python mysql sqlalchemy

我在Python 3.4中使用SqlAlchemy和MySql数据库。我需要验证通过PUT / POST调用收到的SQL。检查查询正确性的最快方法是什么?现在我在末尾添加LIMIT 1并执行以检查正确性。在接受请求之前我需要这样做。有时响应时间从~750ms增加到~50ms。有没有比我正在做的更好的方法?

def validate_sql(self, sql: str):
    adapter_logger.debug('Validating query %r', sql)

    conn = cursor = None
    try:
        conn = self._engine.raw_connection()
        cursor = conn.cursor(Cursor)
        cursor.execute('{0} LIMIT 1'.format(sql))
    except (MySQLError, SQLAlchemyError) as e:
        msg = 'Invalid sql - {0!r}. Cause: {1}'.format(sql, e)
        adapter_logger.exception(msg)
        raise errors.DatabaseClientError(msg)
    finally:
        if cursor:
            cursor.close()
        if conn:
            conn.close()

1 个答案:

答案 0 :(得分:1)

检查查询有效性的最快方法应该是使用EXPLAIN,它将检查查询的执行计划而不执行它。

在您的情况下,您可能需要先检查查询是否以SELECT开头,以便字符串不会以EXPLAIN可以使用的任何参数开头。

> CREATE TABLE test (id INT);
> EXPLAIN SELECT id FROM testd;   # invalid query
ERROR 1146 (42S02): Table 'test.testd' doesn't exist
> EXPLAIN SELECT id2 FROM test;   # invalid query
ERROR 1054 (42S22): Unknown column 'id2' in 'field list'
> EXPLAIN SELECT id FROM test;    # valid query
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
...