python在MySQL表名周围插入单引号(')

时间:2013-02-27 21:42:52

标签: python mysql

我有一个名为project1的数据库,其中包含以下表格:

_systbl1
_systbl2
_systbl3
dataset1
dataset2
dataset3

每当添加新用户时,都需要为数据集%表授予MySQL用户odbc的SELECT权限。

为了实现这一点,我使用了一个简单的python脚本,如下所示:

#!/usr/bin/python
import MySQLdb

db = MySQLdb.connect(
    host="localhost",
    user="user",
    passwd="pass",
    db="project1"
    )

    # Create Cursor Object
cur = db.cursor()

# get list of tables beginning with dataset
cur.execute("SHOW TABLES FROM project1 LIKE 'dataset%';")

# run GRANT statement for each table
for row in cur.fetchall() :
    cur.execute("GRANT SELECT ON `project1`.`%s` TO `odbc`@`localhost`;", row)
    cur.execute("GRANT SELECT ON `project1`.`%s` TO `odbc`@`%`;", row)

不幸的是,它给了我以下错误:

Traceback (most recent call last):
  File "mysql_query.py", line 20, in <module>
    cur.execute("GRANT SELECT ON `project1`.`%s` TO `odbc`@`localhost`;", row)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
    self.errorhandler(self, exc, value)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
_mysql_exceptions.ProgrammingError: (1146, "Table 'project1.'dataset1'' doesn't exist")

正如您在错误的最后一行中所看到的,问题是python在生成查询时在表名周围放置一个引号。

我在这里缺少什么?

3 个答案:

答案 0 :(得分:2)

不要对表名使用SQL参数。 SQL参数由数据库适配器转义,不会被解释为除文字值之外的任何内容。

您必须自己插入这些内容,但绝对确定您的表名不包含不受信任的数据(防止SQL注入攻击):

cur.execute("GRANT SELECT ON `project1`.`%s` TO `odbc`@`localhost`;" % row)
cur.execute("GRANT SELECT ON `project1`.`%s` TO `odbc`@`%%`;" % row)

(授权中的%字符已将其加倍转换为%%)。

答案 1 :(得分:1)

改为使用:

cur.execute("GRANT SELECT ON `project`.`%s` TO `odbc`@`localhost`" % row)

这不会使用输入的正常转义。但请注意你的任何表名中的反引号。

答案 2 :(得分:1)

sql = """CREATE TABLE IF NOT EXISTS `""" + project +  """` ( `id` INT(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`))"""