我有以下python代码,它使用 pymysql
图书馆:
# !/usr/bin/python3
import pymysql
db = pymysql.connect("localhost", "root", "redacted", "redacted")
cursor = db.cursor()
query = "INSERT INTO TestTable (text) VALUES ('test');"
cursor.execute(query)
db.commit()
上面的代码工作得很好,但是如果我需要执行系统命令(根据mysql cli语法),例如:
query = "system ls -lah;"
query = "INSERT INTO TestTable (text) VALUES ('test'); system ls -lah;"
query = "\! ls -lah"
我得到以下令人困惑的错误:
Traceback (most recent call last):
File "./app.py", line 9, in <module>
cursor.execute(query)
File "/usr/local/lib/python3.6/dist-packages/pymysql/cursors.py", line 170, in execute
result = self._query(query)
File "/usr/local/lib/python3.6/dist-packages/pymysql/cursors.py", line 328, in _query
conn.query(q)
File "/usr/local/lib/python3.6/dist-packages/pymysql/connections.py", line 516, in query
self._affected_rows = self._read_query_result(unbuffered=unbuffered)
File "/usr/local/lib/python3.6/dist-packages/pymysql/connections.py", line 727, in _read_query_result
result.read()
File "/usr/local/lib/python3.6/dist-packages/pymysql/connections.py", line 1066, in read
first_packet = self.connection._read_packet()
File "/usr/local/lib/python3.6/dist-packages/pymysql/connections.py", line 683, in _read_packet
packet.check_error()
File "/usr/local/lib/python3.6/dist-packages/pymysql/protocol.py", line 220, in check_error
err.raise_mysql_exception(self._data)
File "/usr/local/lib/python3.6/dist-packages/pymysql/err.py", line 109, in raise_mysql_exception
raise errorclass(errno, errval)
pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'system ls -lah' at line 1")
这可能是mysql服务中实现的一个潜在的安全问题(因为我在python中使用其他数据库库时遇到了相同的错误),但是如果是这样,我如何调整这个设置呢?
我使用的是最新版本的ubuntu服务器(18.10)和mysql(ver14.14发行版5.7.24,用于linux(x86_))。
编辑:澄清一下,我非常了解python的 os
或者 subprocess
但我想通过mysql查询尝试上述技术。我也试过不同的司机,比如 MySQLdb
, mysql.connector
但他们都有相同的结果。
1条答案
按热度按时间g0czyy6m1#
这个
system
mysql cli上的命令是一个方便的特性,它允许您在默认的命令解释器上发出执行命令。它不需要或不使用db连接。它仅在unix系统上可用。cli是管理员或用户使用db的工具。它包含一个db驱动程序,但也包含一个系统shell转义;它试图涵盖管理数据库所需的所有功能。
pymysql
(或任何其他符合DBAPI2.0标准的驱动程序包)用于创建到数据库的连接,从这些连接获取游标,并在这些游标上执行sql语句。它不关心系统外壳。db驱动程序是一个软件包,允许开发人员在程序中实现sql查询功能。它不需要做更多的事情,因为如果开发人员在所说的程序中需要额外的功能,他们将使用适当的包来实现它。
如果要从python脚本发出系统命令,
subprocess
可以认为是标准的一揽子计划。