Почему функция create_all не создает мои таблицы?

#python-3.x #postgresql #flask-sqlalchemy

#python-3.x #postgresql #flask-sqlalchemy

Вопрос:

Я создаю небольшое приложение с помощью Flask и SQLAlchemy. (Я новичок в Python)
Ну, я хочу, чтобы Flask-SQLAlchemy создавал таблицы, которые я уже определил в своем коде.

Структура моего проекта выглядит следующим образом:

 application
├── models
│   ├── __init__.py
│   ├── device.py
│   └── user.py
├── static
├── templates
├── __init__.py
├── flask_config.py
└── wsgi.py
  

__init__.py Внутри models пакета выглядит следующим образом:

 from flask_sqlalchemy import SQLAlchemy
from configparser import ConfigParser


class DBHandler:
    def __init__(self):
        self.config = ConfigParser()
        self.configPath = r"application/config.ini"
        self.config.read(self.configPath)

        self.db_username = self.config.get("DEV", "db_username")
        self.db_password = self.config.get("DEV", "db_password")
        self.db_host = self.config.get("DEV", "db_host")
        self.db_port = self.config.get("DEV", "db_port")
        self.db_name = self.config.get("DEV", "db_name")

        self.DB_URL = 'postgresql psycopg2://'   self.db_username   ':'   self.db_password   '@'   
        self.db_host   ':'   self.db_port   '/'   self.db_name

        self.db = SQLAlchemy()  
  

Модели, которые я определил, очень просты. Вот пример user.py :

 from application.models import DBHandler

db_handler = DBHandler()


class User(db_handler.db.Model):
    __tablename__ = 'user'
    id = db_handler.db.Column(db_handler.db.Integer, primary_key=True)
    username = db_handler.db.Column(db_handler.db.String(200), unique=True, nullable=False)
    email = db_handler.db.Column(db_handler.db.String(200), unique=False, nullable=False)  
  

__init_.py Файл приложения выглядит следующим образом:

 from application.models import DBHandler
from application.flask_config import FlaskConfig

from flask import Flask
from flask_restful import Api


def create_app():
    application = Flask(__name__)
    flask_config_obj = FlaskConfig()
    application.config.from_object(flask_config_obj)

    db_handler_obj = DBHandler()
    db_handler_obj.db.init_app(application)

    return application  
  

Для создания таблиц я запускаю этот код в консоли python:

 from application import create_app
import application.models
from application.models.user import User
from application.models.port import Port
from application.models.device import Device
app = create_app()
db_handler = application.models.DBHandler()
with app.app_context():
    db_handler.db.create_all()  
  

Код выполняется без ошибок, но таблицы не создаются.
Что я делаю не так?

РЕДАКТИРОВАТЬ:
Вот мой класс конфигурации Flask, в котором я подключаюсь к базе данных:

 from application.models import DBHandler


class FlaskConfig:
    def __init__(self):
        db_handler = DBHandler()
        self.SQLALCHEMY_DATABASE_URI = db_handler.DB_URL
        self.SQLALCHEMY_TRACK_MODIFICATIONS = False
        self.SECRET_KEY = b'_5#y2L"F4Q8znxec]/'
  

Комментарии:

1. Где вы подключаетесь к базе данных?

Ответ №1:

Вам нужно добавить DB_URL в конфигурацию приложения для подключения к базе данных:

 db_handler_obj = DBHandler()
application.config['SQLALCHEMY_DATABASE_URI'] = db_handler_obj.DB_URL
db_handler_obj.db.init_app(application)
  

Комментарии:

1. Привет @Yakir Tsuberi, я уже делаю это в своем файле конфигурации flask. Проверьте мою правку. Спасибо

2.Попробуйте сконфигурировать без класса, например так: application.config['SQLALCHEMY_DATABASE_URI'] = db_handler_obj.DB_URL application.config['SQLALCHEMY_TRACK_MODIFICATIONS '] = False и т.д.

3. Поместите конфигурацию в функцию create_app и запустите код create_all, но он все еще не работает :/