SQL 매개 변수는 삽입에만 적용 할 수 있습니다 데이터, 테이블 이름이 아닙니다. 즉, 매개 변수는 DDL 문에 대해서도 구문 분석되지 않습니다.
이를 위해서는 문자열 형식을 사용해야합니다.
sql = "CREATE TABLE IF NOT EXISTS {} ( name TEXT, street TEXT, time REAL, age INTEGER )".format(*values)
문제
Madness까지 찾은 후, 나는 여기에 질문을 게시하기로 결정했습니다. Cursor.Execute (SQL, Param) 기능의 보안 변수 치환 기능을 사용하려는 SQLITE3 데이터베이스를 작성하려고합니다. 내 기능은 다음과 같습니다.
#!/usr/bin/env python3
#-*- coding: utf-8 -*-
import sqlite3
def create():
values = ("data")
sql = "CREATE TABLE IF NOT EXISTS ? ( name TEXT, street TEXT, time REAL, age INTEGER )"
con = sqlite3.connect("database.db")
c = con.cursor()
c.execute(sql, values)
con.commit()
c.close()
con.close()
if __name__ = "__main__":
create()
첫 번째 인수는 문자열 형태의 SQL 명령이어야하며 두 번째 인수는 어디에서 대체되어야하는 값의 튜플이어야합니까? SQL 문자열에 있습니다. 그러나 파일을 실행하면 다음 오류를 반환합니다.
$ ./test.py
Traceback (most recent call last):
File "./test.py", line 21, in <module>
create()
File "./test.py", line 14, in create
c.execute(sql, values)
sqlite3.OperationalError: near "?": syntax error
이것은 Paramstyle이 명명 된 (예 : 테이블 양식)로 설정된 경우에도 발생합니다. 여기서 구문 오류를 발견 할 수 없으므로 시스템 어딘가에 문제가 발생해야한다고 생각합니다. Archlinux와 Debian 설치에서 테스트했는데 둘 다 같은 오류를 게시했습니다.
더 이상 원인을 찾아야 할 곳이 없기 때문에 지금은 당신이 있습니다.
해결책
SQL 매개 변수는 삽입에만 적용 할 수 있습니다 데이터, 테이블 이름이 아닙니다. 즉, 매개 변수는 DDL 문에 대해서도 구문 분석되지 않습니다.
이를 위해서는 문자열 형식을 사용해야합니다.
sql = "CREATE TABLE IF NOT EXISTS {} ( name TEXT, street TEXT, time REAL, age INTEGER )".format(*values)
다른 팁
내가 이해 한 바와 같이, 당신의 매개 변수는 테이블 이름입니까?
그래서 당신의 명령이 될 것입니다
tbl = 'my_table'
sql = "CREATE TABLE IF NOT EXISTS '%s' ( name TEXT, street TEXT, time REAL, age INTEGER )" % tbl