При чтении данных в базу данных sqlite с использованием форматированного оператора я могу сгенерировать то, что выглядитPython

Программы на Python
Ответить
Anonymous
 При чтении данных в базу данных sqlite с использованием форматированного оператора я могу сгенерировать то, что выглядит

Сообщение Anonymous »

Это веб-приложение, которое я собираюсь представить в качестве финального проекта онлайн-курса по программированию cs50, используя:
  • python
  • sqlite
  • flask
Цель проекта — оперативное предоставление Возможность выставления оценок моему факультету (я преподаю несвязанный курс): Преподаватель входит в приложение, выбирает, какой студент команде, которой они хотят поставить оценку, показываются изображения учащихся из этой команды и есть форма для отправки оценок. Ввод и вывод представляют собой электронные таблицы csv.
Чтобы упростить реализацию (я надеялся), я использую объект SQL, предоставляемый этим классом:
https://github. com/cs50/python-cs50/blob/main/src/cs50/sql.py
Природа этого объекта SQL заключается в том, что он не будет напрямую взаимодействовать с пандами; dataframe.to_sql не запускается. При проверке исходного кода выясняется, что необходимые функции SQL отсутствуют в объекте SQL. Таким образом, я вручную перебираю каждую строку CSV.
Оценки каждого сеанса генерируют четыре столбца: посещаемость, подготовка, участие и результат; имена столбцов добавляются к сеансу лабораторной работы (например, attendence_lab_1). Как только преподаватель отправляет оценки, данные считываются обратно во временный файл CSV, затем временный файл переименовывается, используя имя исходного файла CSV, перезаписывая его. Для следующего сеанса оценивания я воссоздаю базу данных, читая ее из CSV. Это означает, что я не могу жестко запрограммировать заголовки столбцов; Мне нужно прочитать заголовки из CSV, создать из него список, а затем создать оператор INSET INTO из этого списка заголовков. Используя ответы на Python sqlite3, создайте столбцы таблицы из списка с помощью .format в качестве модели, мне удалось поместить заголовки в таблицу. Но когда я перебираю строки, я получаю ошибки:
  • Операторы должны быть разделены символами новой строки или точкой с запятой.
  • Строковый литерал не завершена
Я думаю, что понимаю, что такое эти типы ошибок, в общем смысле, но не понимаю как я их генерирую.
код:

Код: Выделить всё

# https://pandas.pydata.org/docs/reference/io.html
df = pd.read_csv(stpath, header=0)
#df.to_sql(students, con)
headers = df.columns.values.tolist() # draw list of headers from df

# create table via prepared statement that scales with number of columns in table
def createTableStatement(tableName, columnList):
return f"CREATE TABLE IF NOT EXISTS {tableName} (id INTEGER, {columnList[0]}" + (", {}"*(len(columnList)-1)).format(*(columnList[1:])) + ", PRIMARY KEY(id))"
db.execute(createTableStatement("students", headers))

# read data into table
def createRowStatement(columnList):
return f'"INSERT INTO students ({columnList[0]}' + (', {}'*(len(columnList)-1)).format(*(columnList[1:])) + ') VALUES (?' + (', ?'*(len(columnList)-1)) + ')", row["Student"]' + (', row["{}"]'*(len(columnList)-1)).format(*(columnList[1:])) + ')'

with open(stpath, "r", encoding='utf-8-sig') as file:
reader = csv.DictReader(file)
for row in reader:
x = createRowStatement(headers)
print(x)
db.execute(x)
Более ранняя версия кода заменяла {columnList[0]} на row["Student"]' в инструкции INSERT INTO. В результате был сгенерирован SQL-запрос:

Код: Выделить всё

"INSERT INTO students (Student, Team, Session, Pod, Image, Lab1_Grade, Lab1_attend, Lab1_prep, Lab1_part, Lab1_disect) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", {columnList[0]}, row["Team"], row["Session"], row["Pod"], row["Image"], row["Lab1_Grade"], row["Lab1_attend"], row["Lab1_prep"], row["Lab1_part"], row["Lab1_disect"])
Изменение {columnList[0] на row["Student"]' привело к созданию соответствующего списка заголовков:

Код: Выделить всё

"INSERT INTO students (Student, Team, Session, Pod, Image, Lab1_Grade, Lab1_attend, Lab1_prep, Lab1_part, Lab1_disect) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", row["Student"], row["Team"], row["Session"], row["Pod"], row["Image"], row["Lab1_Grade"], row["Lab1_attend"], row["Lab1_prep"], row["Lab1_part"], row["Lab1_disect"])
Я подозреваю, что ошибка как-то связана с этим поведением. Я пропустил кавычку? Я положил слишком много? Неужели строка кода слишком длинная (как ее разбить?)?

Подробнее здесь: https://stackoverflow.com/questions/791 ... i-can-gene
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»