4

次のテーブルを持つ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がクエリを生成するときにテーブル名を一重引用符で囲んでいることです。

ここで何が欠けていますか?

4

3 に答える 3

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)

%助成金のキャラクターが2倍になってエスケープされた場合%%)。

于 2013-02-27T21:46:37.640 に答える
1

代わりに以下を使用してください:

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

これは、入力の通常のエスケープを使用しません。ただし、テーブル名のバッククォートには注意してください。

于 2013-02-27T21:46:33.727 に答える
1
sql = """CREATE TABLE IF NOT EXISTS `""" + project +  """` ( `id` INT(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`))"""
于 2015-08-27T00:17:55.477 に答える