SQLite3 "OperationalError: near "?": syntax error" Hatası

Merhaba arkadaşlar.

SQLite ile çalışırken şu kodda,

import sqlite3


with sqlite3.connect(":memory:") as db:
    cursor = db.cursor()

    cursor.execute("CREATE TABLE temp(data TEXT);")
    cursor.execute("INSERT INTO temp VALUES (40);")
    ####################################################

    # Çalışmıyor:
    cursor.execute("UPDATE temp SET data = data ?;", (-20,))

    # Çalışıyor:
    cursor.execute("UPDATE temp SET data = data {};".format("-20"))

    ####################################################
    print(cursor.execute("SELECT * FROM temp;").fetchall())

şöyle bir hata ile karşılaşıyorum:

Traceback (most recent call last):
  File "<file>", line 12, in <module>
    cursor.execute("UPDATE temp SET data = data ?;", (-20,))
sqlite3.OperationalError: near "?": syntax error

Sizce bu sorunun sebebi nedir?
Ve bunu f-string veya format metodu kullanmadan çözebilir miyim?

Buranın data = ? olması gerekmiyor mu? data = data ? ne demek ki?

Hayır, orada girilen değer doğrultusunda mevcut veriden eksiltme/artırma yapmaya çalışıyorum.

Soru işaretlerini değişken gibi düşünün, bu Python kodu nasıl çıkarma işlemi yapmıyor ise data = data ? da yapmaz:

data = 40
x = -20
data = data x

Kod bu hali ile çalışıyor:

import sqlite3


with sqlite3.connect(":memory:") as db:
    cursor = db.cursor()

    cursor.execute("CREATE TABLE temp(data TEXT);")
    cursor.execute("INSERT INTO temp VALUES (40);")
    ####################################################

    # Çalışmıyor:
    cursor.execute("UPDATE temp SET data = data + ?;", (-20,))

    # Çalışıyor:
    cursor.execute("UPDATE temp SET data = data {};".format("-20"))

    ####################################################
    print(cursor.execute("SELECT * FROM temp;").fetchall())

Ama f-string veya herhangi bir string metodu yerine her zaman soru işaretleri kullanmanız daha doğru ve güvenli olur.

1 Beğeni

Teşekkür ederim. Bu sorun, beni biraz yormuştu 20’nin önündeki '-'yi bir operatör yerine kullanmaya çalışmıştım, böylesi çok daha mantıklı oldu. :slight_smile:

Evet bunu biliyorum. Bu yöntem SQL injection’ı engelliyormuş.