【问题标题】:adding a dynamic table name in python在python中添加动态表名
【发布时间】:2018-11-23 20:08:12
【问题描述】:

在给定的查询中,我试图将表名作为用户的输入:

import MySQLdb
import csv
conn=MySQLdb.connect("localhost","root","","graphdata")

c=conn.cursor()
a= raw_input("Enter the table name")
sql='''SELECT distinct sku FROM %s_management'''
c.execute(sql,str(a))
rows=c.fetchall()

file=open('mine.csv','a+')

for eachRow in rows:
    print eachRow
    a=eachRow
    file.write(str(a)+"\n")

file.close()

我想要的是编译器应该像

Enter table name:

我应该输入表名

Enter table name: inventory

它应该在查询中连接起来:

sql='''SELECT distinct sku FROM inventory_management'''

但到目前为止,我收到了这些错误:

 c.execute(sql,str(a))
  File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 198, in execute
    query = query % args
TypeError: not all arguments converted during string formatting


  File "change.py", line 7, in <module>
    sql='''SELECT distinct sku FROM %s'''(a)
TypeError: 'str' object is not callable


    c.execute("SELECT distinct sku FROM %s_management")(a)
  File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 219, in execute
    self.errorhandler(self, exc, value)
  File "C:\Python27\lib\site-packages\MySQLdb\connections.py", line 38, in defau
lterrorhandler
    raise errorvalue
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax
; check the manual that corresponds to your MySQL server version for the right s
yntax to use near '%s_management' at line 1")

【问题讨论】:

  • 很遗憾,表不能作为参数替换的目标。更多信息在这里stackoverflow.com/a/3247553/3603445
  • @chakri 下面给出的解决方案得到了解决。感谢您提供的链接

标签: python sql python-2.7 mysql-python


【解决方案1】:

使用format()的字符串

>>> sql='SELECT distinct sku FROM {}_management'.format(a)
>>> sql
>>> 'SELECT distinct sku FROM inventory_management'

然后您只需将查询传递给光标:

c.execute(sql)

【讨论】:

    【解决方案2】:

    我不建议这样做,因为它会带来安全问题,但您可以这样做 -

    c.execute(sql % str(a))
    

    或者在 python 中使用任何其他类型的字符串格式化程序来更改表名。

    【讨论】:

    • 可以解释一下可能存在的问题
    • @user9144536 了解 SQL 注入。将用户定义的输入作为查询直接执行是非常危险的。使用 format() 或任何其他操作字符串的方式也是同样的问题。
    • 谢谢老哥,帮了大忙
    猜你喜欢
    • 2019-11-05
    • 2011-02-26
    • 2021-04-09
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多