Почему не создается таблица в базе данных MySQL?
Вот 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', это и к правилам хорошего тона проектирования баз данных ближе.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для того чтобы создать таблицу в базе данных 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 );
Если после проверки всех вышеперечисленных причин проблема по-прежнему остается, попробуйте выполнить запрос через утилиту для работы с базой данных (например, phpMyAdmin) или обратитесь к администратору базы данных для дальнейшей диагностики проблемы.