Как ВСТАВИТЬ в таблицу с помощью AUTO_INCREMENT?

Я пытаюсь добавить новых пользователей в таблицу MySQL при их регистрации. Я использую FlaskApp на PythonAnywhere.

Вот мой запрос:

INSERT INTO user_profile (email, user_name, first_foo) VALUES (%s, %s, 0);

Это запускается из моего кода flask_app:

def connect_db(query, params):

    db_connection= MySQLdb.connect("<username>.mysql.eu.pythonanywhere-services.com","<username>","<password","<db_name>", cursorclass=MySQLdb.cursors.DictCursor)

    cursor=db_connection.cursor()
    cursor.execute(query, params)
    result = cursor.fetchone()

    return result

connect_db(query, (email, username,))

Вот моя структура таблицы:

+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| user_id      | int         | NO   | PRI | NULL    | auto_increment |
| email        | varchar(50) | YES  | UNI | NULL    |                |
| user_name    | varchar(15) | YES  | UNI | NULL    |                |
| first_foo    | tinyint(1)  | YES  |     | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+

К сожалению, я продолжаю получать:

MySQLdb._exceptions.OperationalError: (1048, "Column 'user_id' cannot be null")

Я попробовал несколько запросов, в том числе:

INSERT INTO user_profile (user_id, email, user_name, first_foo) VALUES (NULL, %s, %s, 0);
INSERT INTO user_profile (user_id, email, user_name, first_foo) VALUES (DEFAULT, %s, %s, 0);
INSERT INTO user_profile (user_id, email, user_name, first_foo) VALUES (0, %s, %s, 0);

но все возвращают одну и ту же ошибку.

Если я запускаю первый запрос в консоли MySQL на Python Anywhere, запрос будет успешным.

Заранее спасибо за любую помощь.

Не могли бы вы отредактировать свой вопрос, включив в него код Python, который выполняет ваш SQL-запрос?

Woodford 04.09.2024 21:44

@Woodford Спасибо, что заглянули. Я только что добавил код Python.

NucyLoodle 04.09.2024 21:52

Вы уверены, что используете именно тот код Python? Попробуйте добавить что-нибудь очевидное, например, отпечаток, чтобы быть уверенным на 100%.

Schwern 04.09.2024 22:07

попробуйте добавить это db_connection.commit() после cursor.execute(query,params) никогда не угадаешь.

Derek Roberts 04.09.2024 22:13

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

Shadow 04.09.2024 22:35

гораздо лучше показать структуру таблицы, используя show create table user_profile; это дает нам гораздо больше информации. ваш первый запрос — правильный способ сделать это; похоже, что вы используете не ту версию своего кода, о которой думаете, или ваш код Python не подключается к базе данных или серверу, на котором находится ваша консоль.

ysth 05.09.2024 01:54

Спасибо всем за ваш вклад. У меня действительно есть оператор печати в этой функции (я просто удалил его при публикации, чтобы его было легче читать). Я использую эту функцию в другом запросе и знаю, что она определенно работает. @DerekRoberts - добавление коммита сработало!!!! Большое спасибо!!! Меня всегда так удивляет, что малейшее дополнение может решить всё!! Вы хотите поставить это как ответ, и тогда я смогу его принять?

NucyLoodle 05.09.2024 08:19

@NucyLoodle потрясающе!!!

Derek Roberts 05.09.2024 08:35

ох @NucyLoodle, пожалуйста, я также добавил это в качестве ответа, чтобы, если кому-то понадобится помощь с такого рода вопросом, было легче найти ответ.

Derek Roberts 05.09.2024 08:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
9
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

к сожалению, мой английский не очень хорош, но. Правильно ли вы объявили, что столбец автоматически увеличивается?

Эту проблему можно решить, указав, с какого значения будет начинаться приращение:

ALTER TABLE YourTableName MODIFY user_id INT NOT NULL AUTO_INCREMENT;

Структура таблицы в вопросе показывает, что это auto_increment. А если бы это было не так, INSERT INTO user_profile (user_id, email, user_name, first_foo) VALUES (0, %s, %s, 0); сработало бы.

Schwern 04.09.2024 22:06
Ответ принят как подходящий

Из комментария ОП это сработало, после каждой транзакции, такой как запросы INSERT, UPDATE, DELETE, добавление commit() имело решающее значение после execute().

cursor = db_connection.cursor()
         cursor.execute(query, params)
         db_connection.commit()  #  <- add this

Другие вопросы по теме

Похожие вопросы

Дилемма 100 заключенных: кодекс всегда приводит к провалу (все заключенные умирают)
Как устранить ошибку AttributeError: у модуля «Фиона» нет атрибута «Путь»?
Я работаю над тем, чтобы сделать бота Python, который будет нажимать кнопку в списке, который повторяется сам, используя селен
Какие замены регулярных выражений помогают при переписывании SQL-запросов MS Access как простых запросов TSQL? Как их можно зациклить с помощью Excel в качестве входных и выходных данных?
Сообщение об ошибке с использованием нескольких замен строк %s
Должны ли классы аутентификации и классы разрешений в представлениях Django REST Framework определяться с помощью списков или кортежей?
Есть ли сценарий, в котором `foo in list(bar)` нельзя заменить на `foo in bar`?
Выполняется ли простое задание в Python дважды?
Итерация (или нет?) параметров для matplotlib для построения функции в Python
Установка ограничения рекурсии не работает в автономном интерпретаторе Python, но работает в онлайн-интерпретаторах