如何在Python中使用变量名创建MySQL表?

6 投票
6 回答
10127 浏览
提问于 2025-04-18 04:55

我试着用这篇文章 Python MySQLdb 执行表变量 作为例子,但到现在为止都没有成功。我想创建一个表,表名是“archive”和传入的年份拼接而成的。这是为了避免直接写死表名,比如“archive_2013”。

这是我的代码片段:

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 代码片段:

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 注入问题。以下是我的代码片段:

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

我会进一步研究占位符的语法,但在此期间,任何其他建议都非常欢迎!

6 个回答

0

这里有一段代码,首先定义了一个变量叫做,它的值是'users',也就是我们要创建的表的名字。接下来,sql这个变量里存放了一条SQL语句,这条语句的意思是:如果还没有这个表,就创建一个名为'users'的表。这个表里有两个字段,一个是名字(name),它可以存放最多90个字符的文本;另一个是年龄(age),它是一个整数,最多可以有3位数字。

0

你可以试试下面的代码:

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

对于那些在表名和插入值中都使用%s的人,这样是行不通的,你需要使用不同的格式方法,像这样:

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

试试这个:

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

走老派风格

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

print sql# check if printed correctly

撰写回答