用变量替换表名。使用Python和MySQL连接器。

3
我想动态更改我插入数据的表的变量名。
目前这个可以工作。
def dataEntry(subreddit, _title, _post_url, _imageURL):
    cnx = mysql.connector.connect(**config)

    c = cnx.cursor()
    insert = ("""INSERT INTO FoodPorn
                    (subreddit, title, post_url, imageURL)
                    VALUES (%s, %s, %s, %s)""")

    data_value = (subreddit, _title, _post_url, _imageURL)

    c.execute(insert, data_value)
    cnx.commit()
    c.close()
    cnx.close()

dataEntry("fake", "fake", "fake", "fake")

但是,当我尝试对这个表名(在这种情况下为“FoodPorn”)进行相同的操作时,但对于像这个示例中的动态表名(MachinePorn)这样的表名,情况就不同了。
def dataEntry(subreddit, _title, _post_url, _imageURL):
    cnx = mysql.connector.connect(**config)

    c = cnx.cursor()
    insert = ("""INSERT INTO subredditName
                    (subreddit, title, post_url, imageURL)
                    VALUES (%s, %s, %s, %s, %s)""")

    data_value = ("MachinePorn", subreddit, _title, _post_url, _imageURL)

    c.execute(insert, data_value)
    cnx.commit()
    c.close()
    cnx.close()

dataEntry("fake", "fake", "fake", "fake")

我收到了这个错误。
mysql.connector.errors.ProgrammingError: 1146 (42S02): Table 'sytykr.subredditname' doesn't exist

这让我相信我不能这样做,因此我想问如何做到最终可以传入表的变量名,而不是每次都硬编码。
1个回答

9

这个mysql connector显示的异常告诉你,表在你的数据库中不存在。

此外,你试图使用'MachinePorn'作为参数,但在查询中并没有定义它,而是硬编码了'subredditName'。

我认为你应该将数据库定义为查询的另一个参数,这样就可以正常运行:

def dataEntry(subreddit, _title, _post_url, _imageURL):
     cnx = mysql.connector.connect(**config)

     c = cnx.cursor()
     insert = cnx.escape_string("INSERT INTO MachinePorn (subreddit, title, post_url, imageURL) VALUES (%s, %s, %s, %s)")

     data_value = (subreddit, _title, _post_url, _imageURL)

     c.execute(insert, data_value)
     cnx.commit()
     c.close()
     cnx.close()

dataEntry("fake", "fake", "fake", "fake")

3
这部分是正确的。你无法在准备好的语句中对表名称进行参数化。你需要手动将查询字符串与(最好通过cnx.escape_string()转义)表名连接起来。 - Conspicuous Compiler
1
但它正在使用符合DB API v2.0的mysql.connector。为什么需要手动转义字符串呢? - Rafa Moyano
请参见https://dev59.com/d2gu5IYBdhLWcg3wdGwb。 - Conspicuous Compiler
@ConspicuousCompiler 我已按照你的建议编辑了代码。mysql connector库中没有escape_string方法,如果你使用MySQLdb,你将能够调用它。 - Rafa Moyano
escape_string在这里被包含并记录 - https://dev.mysql.com/doc/connector-python/en/connector-python-api-cext-escape-string.html - evan_b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接