SQLITE - Insert ze zmiennymi

0

Witam wszystkich

Musze wrzucic do bazy danych w sqqlite, trzy wartosci i nie mam pojecia, gdzie jest problem. Za kazdym razem wywala informacje, ze wartosc powinna byc string, ale nie wiem, o co mu ddokladnie chodzi i o ktora wartosc. Wywala się przy komendzie execute. Majstruje juz różne kombinacje, ale nie działają

ValueError: operator parameter must be str
sql_create_queue_table = """ CREATE TABLE IF NOT EXISTS queue (
                                             id INT PRIMARY KEY AUTOINCREMENT,
                                             added REAL,
                                             tag1 TEXT,
                                             tag2 TEXT
                                         ); """


 sql = """INSERT INTO queue(added, tag1, tag2) VALUES(?, ?, ?)""", [added, tag1, tag2]


cur = self.conn.cursor()
cur.execute(sql)
2
 sql = "INSERT INTO queue VALUES(?, ?, ?)", (added, tag1, tag2,)
0

Ale skad wiadomo, w ktore pola wstawic? Z tego co znam sql, to taki zapis oznacza, ze trzeba wstawic wszystkie 4 wartosci, w tym pole id, ale jest podane tylko 3 wartosci.
A te wartosci added, tag1, tag2, to sa zmienne, czy cos innego?

4

zacznij od tego, żeby zamiast sparametryzowanego zapytania uruchomić zwykłe, np. takie INSERT INTO queue(added, tag1, tag2) VALUES(1.2, 'aaa', 'bbb') jak Ci to zadziała to będziemy dalej patrzeć :)

0

Dzięki. O tym samym pomyślałem wczoraj i tak zrobiłem. Było trochę zabawy z tymi plusami miedzy zmiennymi, ale się udało i taki zapis działa. Zabawne jest to, że tego drugiego zapisu praktycznie nie sposób znaleźć w necie i wszyscy pokazują ten pierwszy.

3

To czego używałeś to prepared statements i nie powinno być zastępowane na stałe przez zapytania ze złączeń stringów bo omijasz mechanizmy zabezpieczające przed SQL Injection.
Jeśli zrobiłeś już testowo przez złączenia stringów to teraz zobacz czy uda Ci się to przerobić na pierwszą metodę. Wiesz już jak powinno to wyglądać.

0

Poprzedni przykład zrobiłem bez parametrów, tylko w formie zwykłego zapytania SQL, ale przy kolejnym skrypcie znowu natrafiłem na ten problem i udało mi sie rozwiązać, choć nie tak jak chciałem.

Na początku próbowałem zaapisać zapytanie do zmiennej sql i dopiero przekazać do execute, ale ciągle marudził, więc postanowiłem zaapytanie bezpośrednio wrzucić do komendy execute i poszło.

c.execute("INSERT INTO logi(opis, date_time, operation, direction, protocol, dst_port, src_ip) VALUES(?, ?, ?, ?, ?, ?, ?)", ["opis", 1.1, "operation", "direction", "protocol", 1, "src_ip"])

1 użytkowników online, w tym zalogowanych: 0, gości: 1