Python中SQLite执行CREATE TABLE时出现[i]语法错误求助
解决SQLite创建表时的
syntax error near "[i]"问题 Hey Gabriel, 我一眼就发现问题所在了——你在SQL语句里直接写了Python的列表索引[i],但SQL解析器根本不理解Python的语法!它看到simbolo[i]的时候,会把[i]当成SQL的一部分,这显然不符合SQL的语法规则,所以才会抛出sqlite3.OperationalError: near "[i]": syntax error这个错误。
另外我注意到你代码里有个小笔误:你用len(B3tickers())获取列表长度,但循环里却写了simbolo[i],应该是想取B3tickers列表里的元素作为表名吧?我在下面的解决方案里已经修正了这个问题。
正确的做法:把Python变量插入到SQL语句中
你需要用Python的字符串处理方式,把列表里的每个元素作为表名动态插入到CREATE TABLE语句里,推荐用f-string(Python 3.6及以上版本支持),写法简洁又直观:
# 假设B3tickers是你的列表,比如: B3tickers = ["PETR4", "VALE3", "ITUB4"] for i in range(len(B3tickers)): table_name = B3tickers[i] # 用f-string把表名嵌入SQL语句 cur.execute(f''' CREATE TABLE {table_name} ( data DATETIME PRIMARY KEY, open REAL, high REAL, low REAL, close REAL, adjclose REAL ) ''')
额外注意事项
如果你的表名包含空格、特殊字符(比如-、.)或者刚好是SQL的关键字(比如DATE、TABLE),一定要用双引号把表名括起来,避免再次触发语法错误:
cur.execute(f''' CREATE TABLE "{table_name}" ( data DATETIME PRIMARY KEY, open REAL, high REAL, low REAL, close REAL, adjclose REAL ) ''')
为什么不能用SQL参数化?
可能你会好奇,为什么不用SQL的参数化方式(比如?占位符)来传递表名?那是因为SQL参数化只适用于数据值(比如INSERT、UPDATE里的字段值),而表名、列名这类标识符是不能用参数化的,必须用字符串格式化来处理。
内容的提问来源于stack exchange,提问作者Gabriel Pereira
相关产品推荐
相关产品推荐

