sqlite3 Python запрос, необходимый для теста не работает - PullRequest
0 голосов
/ 11 марта 2019

Для моего школьного проекта я решил сделать инструмент пересмотра физики.Инструмент позволяет пользователям входить в систему и сохраняет информацию об их производительности по определенным вопросам.В результате я понял, что мне нужно назвать каждую таблицу, в которой хранятся оценки каждого отдельного пользователя, поэтому я подумал, что использование .format будет уместным.Казалось, что он работал нормально до того момента, когда мне нужно было добавить код, который будет добавлять информацию в таблицу.Из тестирования, которое я провел на коде до сих пор, я думаю, что проблема в том, что я использую .format, он фактически не создает никаких столбцов.Я не знаю, как обойти это, пожалуйста, помогите.Соответствующие разделы кода были предоставлены:

def quesprep():
intro.destroy()
con= sqlite3.connect("login.db")
c= con.cursor()
c.execute("SELECT accid FROM credentials WHERE accountname = ?", (user,))
global results
results=c.fetchall()
con.commit()
con.close()
con= sqlite3.connect("store.db")
c= con.cursor()
c.execute("""CREATE TABLE IF NOT EXISTS {}(mod integer, ques integer,score integer)""".format(results))
c.execute("INSERT INTO {} Values(mod=2,ques=1, score=0)".format(results))
con.commit()
con.close()
ques()


def mod2q1page():
questionspage.destroy()
con= sqlite3.connect("login.db")
c= con.cursor()
c.execute("SELECT accid FROM credentials WHERE accountname = ?", (user,))
global results
results=c.fetchall()
con.commit()
con= sqlite3.connect("store.db")
c= con.cursor()
c.execute("INSERT OR IGNORE INTO {} VALUES(mod=2, ques=2, score=0)" .format(results))

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

нашел решение:

intro.destroy()
con= sqlite3.connect("login.db")
c= con.cursor()
c.execute("SELECT accountname FROM credentials WHERE accountname = ?", (user,))
results=c.fetchone()
global tablename
tablename=" ".join(map(str, (results)))
con.commit()
con.close()
global m
m="mod"
global q
q="ques"
global s
s="score"
fieldtype="INTEGER"
con=sqlite3.connect("store.db")
c=con.cursor()
c.execute('CREATE TABLE IF NOT EXISTS {} ({fc} {ft}, {sc} {ft2}, {tc} {ft3})'\
          .format(tablename, fc=m, ft=fieldtype, sc=q, ft2=fieldtype, tc=s, 
ft3=fieldtype))
    con.commit()
    con.close()
0 голосов
/ 11 марта 2019

Кажется, здесь есть несколько неправильных вещей.

Формат принимает переменную внутри {} ... например {0}, {1} и т. Д.

Заполнители являются предпочтительным маршрутом длявозьмите с форматированием SQL-запросов ... как вы делали в SELECT

Я не уверен, в чем проблема, но если вы пытаетесь добавить столбцы, вам нужно изменить таблицу ... не вставлять.INSERT добавит элемент строки.Если вы можете опубликовать ошибку, возможно, мы можем помочь немного больше.Для начала попробуйте заполнители вместо формата.

Кроме того, fetchall возвращает список кортежей ... необходимо отправить кортеж в sql, а не список.

for x in results:
    c.execute("INSERT INTO ? (col1, col2, col3) VALUES (1, 2, 3);", x)

Редактировать:

Я исправлен - я запустил этот код:

    data = [('user',)]
    cursor.execute("INSERT INTO ? (id, email, password) VALUES (1, test, test);", data)

синтаксическая ошибка, поскольку вы не можете добавить заполнитель к имени таблицы.Прочитайте здесь

Я использовал формат с {0}:

cursor.execute("INSERT INTO {0} (id, email, password) VALUES (1, test, test);".format('user'))

Запрос был успешным.Я считаю, что это ваша проблема здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...