我在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()
答案 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 |
...