Mam 2 rzeczy, z którymi potrzebowałem pomocy:

1) Nie jestem pewien, jak mogę sprawdzić, czy tabela istnieje w Pythonie za pomocą biblioteki sqlite3.

2) Nie jestem pewien, jak mogę zapisać zmienne z programu w bazie danych. Chcę móc sprawdzić, czy UserDetails istnieje przed utworzeniem bazy danych.

Czytałem dookoła i każdy robi coś inaczej,

Oto sekcja mojego kodu, która jest odpowiedzialna za zapisywanie zmiennych:

    connection = sqlite3.connect("UserDetails.db") 
    crsr = connection.cursor() 

    #create table
    sql_command = table_creator
    crsr.execute(sql_command)

    #insert values into table
    data_to_insert = (username, first_name, surname, age, user_salt, password_hash, date_today)
    sql_command = """INSERT INTO UserDetails VALUES ((?, ?, ?, ?, ?, ?, ?), data_to_insert);"""
    crsr.execute(sql_command)

    connection.commit() #save changes
    connection.close()  #terminate connection

A jeśli chcesz zobaczyć table_creator, wygląda to tak:

table_creator = '''CREATE TABLE `UserDetails` ( `Username` VARCHAR(8) NOT NULL, `Firstname` VARCHAR(10) NOT NULL, `Surname` VARCHAR(20) NOT NULL, `Age` INT(2) NOT NULL, `Salt` VARCHAR(10) NOT NULL, `Hash` VARCHAR(64) NOT NULL, `Date` DATE NOT NULL, PRIMARY KEY (`UserName`) );'''

Będę wdzięczny i informacje zwrotne lub wsparcie. Wciąż uczę się kodować, a mój nauczyciel CompSci nie uczy nas konkretnie Pythona, więc wiem, że jestem samoukiem.

Aha i to jest komunikat o błędzie, który otrzymuję:

Traceback (most recent call)
  File "c:/Users/Arslan/Project A2/login.py", line 99, in <module>
    save_details()
  File "c:/Users/Arslan/Project A2/login.py", line 93, in save_details
    crsr.execute(sql_command)
sqlite3.OperationalError: no such column: data_to_insert

0
Arslan 20 grudzień 2019, 01:05

2 odpowiedzi

Jak sprawdzić, czy tabela istnieje, czy nie :

  • Pierwszy sposób:

Użyj tego zapytania:

SELECT name FROM sqlite_master WHERE type='table' AND name='{table_name}';

Zmodyfikuj {table_name} za pomocą stołu, aby sprawdzić Istnieją dwa przypadki:

. Jeśli kursor równy 0 ==> tabela nie istnieje W przeciwnym razie tabela istnieje

  • Drugi sposób:

Posługiwać się :

 PRAGMA table_info(table_name)

Przykład:

enter image description here

  • Trzeci sposób:

Użyj tego zapytania:

select 1 from table

Zwróci stałą 1 dla każdego wiersza tabeli, jeśli tabela istnieje, lub nic, jeśli nie.

  • Sposobów jest wiele, ale moim zdaniem wymieniłem te najlepsze.

Jak zapisać zmienne z programu do bazy danych:

Aby wstawić dane do sqlite3, możesz użyć:

cursor.execute("insert into UserDetails values (?, ?, ?, ?, ?, ?, ?)", (username, firstname, surname, age, salt, hash, date))

NIE UŻYWAJ (wstrzyknięcie SQL):

cursor.execute("insert into UserDetails values ('{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}')".format(username, firstname, surname, age, salt, hash, date))

Nie zapomnij:

conn.commit()

Lub możesz zamiast tego użyć połączenia jako menedżera kontekstu:

with conn:
   # then cursor.execute..
1
Mahrez BenHamad 20 grudzień 2019, 01:55
1
Wow, dzięki za mini lekcję. Spróbuję to przeczytać i dowiedzieć się, co się dzieje.
 – 
Arslan
20 grudzień 2019, 02:02
Witam ponownie, potrzebuję trochę pomocy z moim wybranym zapytaniem. username_finder = ' SELECT Salt, Hash FROM UserDetails WHERE Username = ?, (username_input,) ' wydaje mi się, że nie podoba mi się moje zapytanie. Chcę, aby zaznaczył wszystkie sole i haszy, gdy nazwa użytkownika pasuje do username_input
 – 
Arslan
20 grudzień 2019, 03:09
Tak, jest dobrze, użyj : sql_query = """ SELECT Salt, Hash FROM UserDetails WHERE Username = ?""" potem cursor.execute(sql_query, (username_input,)) i aby zobaczyć wynik : username_finder = cursor.fetchall() , następnie iteruj, aby zobaczyć wynik, for row in username_finder: #etc
 – 
Mahrez BenHamad
20 grudzień 2019, 03:31

1) Nie jestem pewien, jak mogę sprawdzić, czy tabela istnieje w Pythonie za pomocą biblioteki sqlite3.

Użyj CREATE TABLE IF NOT EXISTS:

table_creator = '''CREATE TABLE IF NOT EXISTS `UserDetails` ( 
    `Username` VARCHAR(8) NOT NULL,
    `Firstname` VARCHAR(10) NOT NULL,
...
);'''

2) Nie jestem pewien, jak mogę zapisać zmienne z programu w bazie danych.

Możesz przekazywać zmienne do wstawiania z następującą składnią:

 data_to_insert = (username, first_name, surname, age, user_salt, password_hash, date_today)
sql_command = '''INSERT INTO UserDetails VALUES (?, ?, ?, ?, ?, ?, ?)''';
crsr.execute(sql_command, data_to_insert )
0
GMB 20 grudzień 2019, 01:12