簡體   English   中英

python在MySQL表名周圍插入單引號(')

[英]python inserting single quotes (') around MySQL table name

我有一個名為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在生成查詢時在表名周圍放置單引號。

我在這里錯過了什么?

不要將SQL參數用於表名。 SQL參數由數據庫適配器轉義,不會被解釋為除文字值之外的任何內容。

您必須自己插入這些內容,但絕對確定您的表名不包含不受信任的數據(防止SQL注入攻擊):

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

(通過將其加倍到%%來轉移授權中的%字符)。

而是使用:

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

這不會使用輸入的正常轉義。 但要注意你的任何表名中的反引號。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM