【问题标题】:How do I create a mysql table using a variable name in Python?如何在 Python 中使用变量名创建 mysql 表?
【发布时间】:2014-04-30 17:31:09
【问题描述】:

我尝试以文章Python MySQLdb execute table variable 为例,但到目前为止还没有任何乐趣。我正在尝试创建一个表,其名称是“存档”的串联,并且作为变量传入的年份。这是硬编码表名称的替代方法,例如“archive_2013”​​。

这是我的代码 sn-p:

year_string = sys.argv[1]
if int(year_string) < 1999 or int(year_string) > 2014:
    print "\n"
    print "Year must be between 1999 and 2014\n"
    sys.exit(1)    

table_name = "archive_" + year_string

# Open database connection
db = MySQLdb.connect("localhost","root","menagerie","haiku_archive" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Create table using execute() method.

sql = ""CREATE TABLE IF NOT EXISTS %s" % table_name
      haiku_text VARCHAR(120), 
      date_written CHAR(22))"
cursor.execute(sql)

这是我得到的错误:

pablo@desktop=> ./insert_haiku_from_file_into_table.py 2013 qwert.txt
  File "./insert_haiku_from_file_into_table.py", line 36
    sql = ""CREATE TABLE IF NOT EXISTS %s" % table_name
                 ^
SyntaxError: invalid syntax

任何帮助将不胜感激!


我尝试实施收到的回复,但到目前为止效果并不理想。这是我使用三引号 SQL 的 sn-p:

sql = """CREATE TABLE IF NOT EXISTS %
      haiku_text VARCHAR(120), 
      date_written CHAR(22))""" % table_name
cursor.execute(sql)

当我执行脚本时,我最终得到以下信息:

pablo@desktop=> ./insert_haiku_from_file_into_table.py 2013 qwert.txt
Traceback (most recent call last):
  File "./insert_haiku_from_file_into_table.py", line 38, in <module>
    date_written CHAR(22))""" % table_name
ValueError: unsupported format character '
' (0xa) at index 28

我还尝试使用占位符表示法,因为我想避免 SQL 注入的最遥远的可能性。这是我的 sn-p:

sql = """CREATE TABLE IF NOT EXISTS ?
      haiku_text VARCHAR(120),
      date_written CHAR(22))""" 
cursor.execute(sql, table_name)

这是我执行时发生的情况:

pablo@desktop=> ./insert_haiku_from_file_into_table.py 2013 qwert.txt
Traceback (most recent call last):
  File "./insert_haiku_from_file_into_table.py", line 39, in <module>
    cursor.execute(sql, table_name)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 159, in execute
    query = query % db.literal(args)
TypeError: not all arguments converted during string formatting

我将进一步研究占位符的语法,但同时任何进一步的建议都会很棒!

【问题讨论】:

  • 不要不使用字符串格式来参数化 SQL 查询。否则你会插入一个严重的安全漏洞:SQL injection。您可以放置​​一个占位符并将参数传递给光标的execute 方法:sql = """CREATE TABLE IF NOT EXISTS ? etc. """; cursor.execute(sql, table_name)。您可以检查全局占位符的语法:MySQLdb.paramstyle。有关详细信息,请参阅spec。
  • 我没有考虑过 SQL 注入的困境,因为变量是由另一个 python 脚本传入的,但我认为最好完全避免它。感谢您的提醒!
  • @Bakuriu 参数不能用于表名,只能在允许表达式的地方使用。
  • 我在其他地方听说参数不能用于表名。我希望情况并非如此。

标签: python mysql


【解决方案1】:

去老学校

sql = "CREATE TABLE IF NOT EXISTS " + table_name  + """
         haiku_text VARCHAR(120), 
         date_written CHAR(22))"""

print sql# check if printed correctly

【讨论】:

  • 正确的间距...从单元格发帖时我不能这样做
  • Jove - 成功了!不知何故,我知道我必须去老学校。感谢您的帮助!
【解决方案2】:

试试:

sql = """CREATE TABLE IF NOT EXISTS %s
         haiku_text VARCHAR(120), 
         date_written CHAR(22))""" % table_name

【讨论】:

  • 我尝试了上述语法并收到以下错误:pablo@pmenanx1=&gt; ./insert_haiku_from_file_into_table.py 2013 qwert.txt Traceback (most recent call last): File "./insert_haiku_from_file_into_table.py", line 38, in &lt;module&gt; date_written CHAR(22))""" % table_name ValueError: unsupported format character ' ' (0xa) at index 28
  • 如果我在%s 中省略了s,我只会收到该错误。
【解决方案3】:

对于那些在表名和插入值中都使用%s的人,这不起作用,你需要使用不同的formate方法,如下所示:

sql = "insert into {table} (f1,f2,f3) values (%s, %s, %s)"
cursor.execute(sql.formate(table="student"), ("name", "age", "score"))

下面是错误的:

sql = "insert into %s (f1,f2,f3) values (%s, %s, %s)"
cursor.execute(sql("student", "name", "age", "score"))

【讨论】:

    【解决方案4】:

    只是另一个角度,并不能真正解决上述问题,但会更改表名。

    my_list = [*range(1999,2021, 1)]
    
    for year in my_list:
        
        sql = "CREATE TABLE archive_" + str(year)+" (category varchar(255), jan" + str(year)+ " varchar(255), feb" + str(year)+ " varchar(255) )"""
        print(sql) 
    

    CREATE TABLE archive_1999 (category varchar(255), jan1999 varchar(255), feb1999 varchar(255) )
    CREATE TABLE archive_2000 (category varchar(255), jan2000 varchar(255), feb2000 varchar(255) )
    CREATE TABLE archive_2001 (category varchar(255), jan2001 varchar(255), feb2001 varchar(255) )
    CREATE TABLE archive_2002 (category varchar(255), jan2002 varchar(255), feb2002 varchar(255) )
    CREATE TABLE archive_2003 (category varchar(255), jan2003 varchar(255), feb2003 varchar(255) )
    CREATE TABLE archive_2004 (category varchar(255), jan2004 varchar(255), feb2004 varchar(255) )
    CREATE TABLE archive_2005 (category varchar(255), jan2005 varchar(255), feb2005 varchar(255) )
    CREATE TABLE archive_2006 (category varchar(255), jan2006 varchar(255), feb2006 varchar(255) )
    CREATE TABLE archive_2007 (category varchar(255), jan2007 varchar(255), feb2007 varchar(255) )
    CREATE TABLE archive_2008 (category varchar(255), jan2008 varchar(255), feb2008 varchar(255) )
    CREATE TABLE archive_2009 (category varchar(255), jan2009 varchar(255), feb2009 varchar(255) )
    CREATE TABLE archive_2010 (category varchar(255), jan2010 varchar(255), feb2010 varchar(255) )
    CREATE TABLE archive_2011 (category varchar(255), jan2011 varchar(255), feb2011 varchar(255) )
    CREATE TABLE archive_2012 (category varchar(255), jan2012 varchar(255), feb2012 varchar(255) )
    CREATE TABLE archive_2013 (category varchar(255), jan2013 varchar(255), feb2013 varchar(255) )
    CREATE TABLE archive_2014 (category varchar(255), jan2014 varchar(255), feb2014 varchar(255) )
    CREATE TABLE archive_2015 (category varchar(255), jan2015 varchar(255), feb2015 varchar(255) )
    CREATE TABLE archive_2016 (category varchar(255), jan2016 varchar(255), feb2016 varchar(255) )
    CREATE TABLE archive_2017 (category varchar(255), jan2017 varchar(255), feb2017 varchar(255) )
    CREATE TABLE archive_2018 (category varchar(255), jan2018 varchar(255), feb2018 varchar(255) )
    CREATE TABLE archive_2019 (category varchar(255), jan2019 varchar(255), feb2019 varchar(255) )
    CREATE TABLE archive_2020 (category varchar(255), jan2020 varchar(255), feb2020 varchar(255) )
    

    【讨论】:

      【解决方案5】:

      你可以试试下面的代码:

      sql = """CREATE TABLE IF NOT EXISTS `%s`
               haiku_text VARCHAR(120), 
               date_written CHAR(22))""" % (table_name)
      

      【讨论】:

      • 请格式化您的代码并添加一些解释。
      【解决方案6】:

      table_name = '用户' sql = "如果不存在则创建表" + table_name + "(name VARCHAR(90), age INTEGER(3))"

      【讨论】:

      • 请尝试为您的答案添加更多详细信息。告诉大家它如何解决提问者面临的问题。还要尝试格式化您的答案,使其易于阅读,并且每个人都知道它的哪一部分处理代码,哪一部分是解释。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 2015-06-20
      • 2011-08-21
      • 2010-12-04
      • 2021-08-05
      相关资源
      最近更新 更多