>source

다음 코드를 실행하려고합니다.

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 테이블에 첫 번째 열에 활성 자동 증가가 있기 때문에. 하지만 오류 메시지와 함께 작동하지 않습니다. 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)

잘 작동한다. 그런데 왜? 차이가 보이지 않아

  • 답변 # 1

    SQL에서는 값에 테이블 이름으로 사용하는 것과 같은 식을 사용할 수 없습니다. 식은 런타임에 평가되므로 식의 값에 따라 다른 테이블에 대해 쿼리를 실행할 수 있습니다.

    그리고 당신은 ? 같은 이유로 SQL에서 표현식을 사용할 수있는 구문입니다.

    그러나 SQLite가 변수를 처리 할 필요가없는 한 물론 SQLite에 Python과 다른 테이블에 대한 쿼리를 제공 할 수 있습니다. 예를 들면 :

    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 .

  • 이전 java - Inteliji IDEA를 시작하면 오류가 발생합니다 어떻게 고칠 수 있습니까?
  • 다음 c# - 디자이너는 UserControl의 DataGridView 속성의 열을 직렬화하지 않습니다