2014-10-12 121 views
1

我想动态地改变我插入数据的表的变量名。用变量替换表名。使用python和mysql连接器

这个当前工作,

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 

这使我相信,我不能做这种方式,所以我禾我想问我该怎么做,以便我最终可以在表中传递一个变量名,而不是每次都要硬编码。

回答

4

显示mysql连接器的异常告诉你该表不存在于你的数据库中。

此外,您正在尝试使用'MachinePorn'作为参数,但是您没有在查询中定义它,它是硬编码'subredditName'。

我想你应该定义数据库查询另一个参数,它会运行良好:

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

    c = cnx.cursor() 
    table_name = "MachinePorn" 
    insert = "INSERT INTO " + table_name + " (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") 
+2

这部分是正确的。您无法在预准备语句中对表名进行参数化。您需要手动连接查询字符串(最好通过'cnx.escape_string()')转义表名。 – 2015-02-12 00:19:20

+0

但它使用的是符合DB API v2.0的mysql.connector。为什么它应该手动扫描字符串? – 2015-02-12 00:27:14

+0

查看http://stackoverflow.com/questions/11312737/can-i-parameterize-the-table-name-in-a-prepared-statement – 2015-02-12 16:44:24