Почему не создается таблица в базе данных MySQL?

Ссылка скопирована
1 ответ

Вот app.py:

from flask import Flask from flask_sqlalchemy import SQLAlchemy from sqlalchemy import create_engine # Creating Flask app app = Flask(__name__)  # Creating SQLAlchemy instance db = SQLAlchemy() user = "cubinez85" pin = "123" host = "localhost" db_name = "testbd"  # Configuring database URI app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{user}:{pin}@{host}/{db_name}"  engine = create_engine("mysql+pymysql://cubinez85:123@localhost/testdb", pool_pre_ping=True)  # Disable modification tracking app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  db.init_app(app)  # Creating Models class User(db.Model):     __tablename__ = 'user'     id = db.Column(db.Integer, primary_key=True)     email = db.Column(db.String(64), unique=True, index=True)     password = db.Column(db.String(128))  def create_db():     with app.app_context():         db.create_all()   if __name__ == "__main__":     create_db()     app.run(debug=True)

from flask import Flask from flask_sqlalchemy import SQLAlchemy from sqlalchemy import create_engine # Creating Flask app app = Flask(__name__) # Creating SQLAlchemy instance db = SQLAlchemy() user = "cubinez85" pin = "123" host = "localhost" db_name = "testbd" # Configuring database URI app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{user}:{pin}@{host}/{db_name}" engine = create_engine("mysql+pymysql://cubinez85:123@localhost/testdb", pool_pre_ping=True) # Disable modification tracking app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db.init_app(app) # Creating Models class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(64), unique=True, index=True) password = db.Column(db.String(128)) def create_db(): with app.app_context(): db.create_all() if __name__ == "__main__": create_db() app.run(debug=True)

Таблица user не создается:

mysql> use testbd; Database changed mysql> show tables; Empty set (0,01 sec)  mysql>

mysql> use testbd; Database changed mysql> show tables; Empty set (0,01 sec) mysql>

В error.log все хорошо:

[2024-04-03 18:31:48 +0300] [35124] [INFO] Using worker: sync [2024-04-03 18:31:48 +0300] [35126] [INFO] Booting worker with pid: 35126 [2024-04-03 18:31:48 +0300] [35127] [INFO] Booting worker with pid: 35127 [2024-04-03 18:31:48 +0300] [35128] [INFO] Booting worker with pid: 35128 [2024-04-03 18:35:13 +0300] [35124] [INFO] Handling signal: term [2024-04-03 18:35:13 +0300] [35126] [INFO] Worker exiting (pid: 35126) [2024-04-03 18:35:13 +0300] [35127] [INFO] Worker exiting (pid: 35127) [2024-04-03 18:35:13 +0300] [35128] [INFO] Worker exiting (pid: 35128) [2024-04-03 18:35:14 +0300] [35124] [INFO] Shutting down: Master [2024-04-03 18:35:15 +0300] [35146] [INFO] Starting gunicorn 21.2.0 [2024-04-03 18:35:15 +0300] [35146] [INFO] Listening at: unix:/var/www/project_flask/ipc.sock (35146) [2024-04-03 18:35:15 +0300] [35146] [INFO] Using worker: sync [2024-04-03 18:35:15 +0300] [35147] [INFO] Booting worker with pid: 35147 [2024-04-03 18:35:15 +0300] [35148] [INFO] Booting worker with pid: 35148 [2024-04-03 18:35:15 +0300] [35149] [INFO] Booting worker with pid: 35149

[2024-04-03 18:31:48 +0300] [35124] [INFO] Using worker: sync [2024-04-03 18:31:48 +0300] [35126] [INFO] Booting worker with pid: 35126 [2024-04-03 18:31:48 +0300] [35127] [INFO] Booting worker with pid: 35127 [2024-04-03 18:31:48 +0300] [35128] [INFO] Booting worker with pid: 35128 [2024-04-03 18:35:13 +0300] [35124] [INFO] Handling signal: term [2024-04-03 18:35:13 +0300] [35126] [INFO] Worker exiting (pid: 35126) [2024-04-03 18:35:13 +0300] [35127] [INFO] Worker exiting (pid: 35127) [2024-04-03 18:35:13 +0300] [35128] [INFO] Worker exiting (pid: 35128) [2024-04-03 18:35:14 +0300] [35124] [INFO] Shutting down: Master [2024-04-03 18:35:15 +0300] [35146] [INFO] Starting gunicorn 21.2.0 [2024-04-03 18:35:15 +0300] [35146] [INFO] Listening at: unix:/var/www/project_flask/ipc.sock (35146) [2024-04-03 18:35:15 +0300] [35146] [INFO] Using worker: sync [2024-04-03 18:35:15 +0300] [35147] [INFO] Booting worker with pid: 35147 [2024-04-03 18:35:15 +0300] [35148] [INFO] Booting worker with pid: 35148 [2024-04-03 18:35:15 +0300] [35149] [INFO] Booting worker with pid: 35149

Дополнительно:

Нет, проблема не в названии(пробовал). Похоже проблема в самом драйвере pymysql:
https://docs.sqlalchemy.org/en/20/errors.html#erro...)
Пока не могу найти решение(

  • Если проблема в драйвере, то вопрос можно удалять и писать issue разработчику драйвера. Но я сомневаюсь, что это так, ведь огромное количество людей этим драйвером прямо сейчас пользуются.
  • Решил через DeclarativeBase:
    from flask import Flask from flask_sqlalchemy import SQLAlchemy from sqlalchemy import create_engine from sqlalchemy import  Column, Integer, String from sqlalchemy.orm import DeclarativeBase  app = Flask(__name__)  mysql_database = 'mysql://cubinez85:123@localhost/testdb'  engine = create_engine(mysql_database)  class Base(DeclarativeBase): pass  class Person(Base):     __tablename__ = "people"     id = Column(Integer, primary_key=True, index=True)     name = Column(String(64), unique=True, index=True)     age = Column(String(128))  Base.metadata.create_all(bind=engine)  if __name__ == "__main__":     create_db()     app.run(debug=True)

    from flask import Flask from flask_sqlalchemy import SQLAlchemy from sqlalchemy import create_engine from sqlalchemy import Column, Integer, String from sqlalchemy.orm import DeclarativeBase app = Flask(__name__) mysql_database = 'mysql://cubinez85:123@localhost/testdb' engine = create_engine(mysql_database) class Base(DeclarativeBase): pass class Person(Base): __tablename__ = "people" id = Column(Integer, primary_key=True, index=True) name = Column(String(64), unique=True, index=True) age = Column(String(128)) Base.metadata.create_all(bind=engine) if __name__ == "__main__": create_db() app.run(debug=True)

Ответы:

Возможно дело в том, что user - ключевое слово в MySQL, как и во многих других СУБД. Ключевые слова нельзя использовать в качестве имён таблиц и полей. Попробуйте использовать __tablename__ = 'users', это и к правилам хорошего тона проектирования баз данных ближе.

Нужно решить такую задачу?

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

Заказать помощь
Лучший ответ
1
Игорь Волков Ответ

Для того чтобы создать таблицу в базе данных MySQL, необходимо выполнить несколько шагов и убедиться, что все параметры и запросы указаны корректно. Вот некоторые возможные причины, почему не создается таблица:

1. Ошибка в SQL запросе: Проверьте правильность написания SQL запроса для создания таблицы. Убедитесь, что вы используете правильные ключевые слова, типы данных и синтаксис для создания столбцов и индексов.

2. Отсутствие привилегий: Проверьте, есть ли у вашего пользователя базы данных достаточные права для создания таблиц. Убедитесь, что у вас есть разрешения на выполнение операции CREATE TABLE.

3. Название таблицы уже занято: Убедитесь, что название таблицы, которое вы пытаетесь использовать, не занято другой таблицей в базе данных. Попробуйте использовать уникальное название для вашей таблицы.

4. Ошибка в соединении с базой данных: Проверьте соединение с базой данных, убедитесь, что вы правильно указали хост, имя пользователя, пароль и название базы данных. Попробуйте переподключиться к базе данных и выполнить запрос еще раз.

Пример корректного SQL запроса для создания таблицы в базе данных MySQL:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(255) UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );

Если после проверки всех вышеперечисленных причин проблема по-прежнему остается, попробуйте выполнить запрос через утилиту для работы с базой данных (например, phpMyAdmin) или обратитесь к администратору базы данных для дальнейшей диагностики проблемы.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно