Python Sqlite3 Null作为元组中的非第一个元素不起作用

2024-09-24 22:30:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试执行以下代码:

sqlcode = 'INSERT INTO ? VALUES (?,?,?,?,?,?,?,?)'
sqlparams = ('LOT', None, 'msg_number_1', 'descr_11', 'st_p_11', 'step_11', 'deposit_11', 'decr_pr_11', 'class_11')
cursor.execute(sqlcode, sqlparams)

我尝试使用None,因为LOT table在第一列有活动的自动增量。 但是它不能处理错误消息sqlite3.OperationalError: near "?": syntax error

如果我尝试以下代码:

sqlcode = 'INSERT INTO LOT VALUES (?,?,?,?,?,?,?,?)'
sqlparams = (None, 'msg_number_1', 'descr_11', 'st_p_11', 'step_11', 'deposit_11', 'decr_pr_11', 'class_11')
cursor.execute(sqlcode, sqlparams)

它工作得很好。但是为什么呢?我看不出有什么不同


Tags: 代码nonenumberstepmsglotinsertst
1条回答
网友
1楼 · 发布于 2024-09-24 22:30:49

在SQL中,不能像使用值作为表名那样使用表达式。表达式将在运行时进行计算,这意味着可以根据表达式的值针对不同的表运行查询

出于同样的原因,您只允许使用?语法,您可以在SQL中使用表达式

但是,您当然可以从Python中为SQLite提供不同表的查询,只要SQLite不必处理变量。例如:

table = 'LOT'
sqlcode = f'INSERT INTO {table} VALUES (?,?,?,?,?,?,?,?)'
sqlparams = (None, 'msg_number_1', 'descr_11', 'st_p_11', 'step_11', 'deposit_11', 'decr_pr_11', 'class_11')
cursor.execute(sqlcode, sqlparams)

或者,如果您从其他地方获得该元组:

sqlcode = 'INSERT INTO {} VALUES (?,?,?,?,?,?,?,?)'
sqlparams = ('LOT', None, 'msg_number_1', 'descr_11', 'st_p_11', 'step_11', 'deposit_11', 'decr_pr_11', 'class_11')
cursor.execute(sqlcode.format(sqlparams[0]), sqlparams[1:])

但是如果您可以控制sqlparams,那么前面的解决方案显然更可取

相关问题 更多 >