如何在Python中使用变量名创建MySQL表?
我试着用这篇文章 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
这里有一段代码,首先定义了一个变量叫做
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