记录 splite3 库的一个坑(表名和字段定义不能用占位符?)

Posted Xavier Jiezou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记录 splite3 库的一个坑(表名和字段定义不能用占位符?)相关的知识,希望对你有一定的参考价值。

项目场景

Python 内置 sqlite3 模块的官方文档推荐我们向表中插入记录时使用 ? 充当占位符,然后将数据通过参数传递。而不推荐使用 Python 的字符串拼接操作,说是有 SQL 注入风险。于是我这里创建表的时候也想用占位符这种方式:

import sqlite3
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
sql = 'create table ? (?)'
table_name = 'student'
arg = 'id integer'
cursor.execute(sql, (table_name, arg))
conn.commit()
cursor.close()
conn.close()

问题描述

但执行上述代码报错:

sqlite3.OperationalError: near "?": syntax error

原因分析

表名称和字段定义不能使用 ? 充当占位符。

解决方案

既然表名称和字段定义不支持使用 ? 充当占位符,那就不用了吧,改回 Python 的字符串拼接操作。

import sqlite3
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
table_name = 'student'
arg = 'id integer'
sql = f'create table table_name (arg)'
cursor.execute(sql)
conn.commit()
cursor.close()
conn.close()

引用参考

Inserting a table name into a query gives sqlite3.OperationalError: near “?”: syntax error

以上是关于记录 splite3 库的一个坑(表名和字段定义不能用占位符?)的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL字段名和表名大小写的问题

如何快捷地查询Oracle中每个用户表的表名和行数?

如何用sql将两张表的字段名和列值进行匹配?

MySQL获取Schema表名和字段信息

查询数据库里所有表名和字段名的语句

oracle中,改变表名和字段名的大小写