Python sqlite3 cursor.execute ()가있는 매개 변수가있는 구문 오류가 발생합니까? (Paramstyle Qmark)

StackOverflow https://stackoverflow.com/questions/19843668

문제

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top