Как создать отдельный файл для создания другой таблицы базы данных Flask-SqlAlchemy? - PullRequest
0 голосов
/ 01 февраля 2019

Я использую Flask-Restplus и SqlAlchemy для создания моей таблицы и Api. Проблема, с которой я столкнулся, выглядит следующим образом:

Сначала у меня есть user.py, в котором есть 2 таблицы:

User.py

class User(db.Model):
    __tablename__ = "users_info"

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.Integer, unique=True, nullable=True)
    device = db.relationship('Device', backref='user')
    # .. some other field here


class Device(db.Model):
    __tablename__ = "user_device"

    device_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    id = db.Column(db.Integer, db.ForeignKey(User.id))
    # .. some other field here

На этом этапе я использовал эту 2 команду ниже с manage.py для создания базы данных, и у меня нет проблем.

python manage.py db migrate

python manage.py db upgrade

manage.py

import os
import unittest

from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager
from app import blueprint

from app.main import create_app, db

app = create_app(os.getenv('My_App') or 'dev')
app.register_blueprint(blueprint)

app.app_context().push()

manager = Manager(app)

migrate = Migrate(app, db)

manager.add_command('db', MigrateCommand)


@manager.command
def run():
    app.run()


if __name__ == '__main__':
    manager.run()

Теперь я хочу создать еще один файл с именем product.py, который представляет собой новую таблицу для той же базы данных, как показано ниже:

Product.py

from .. import db
from .model.user import User


class Product(db.Model):
    __tablename__ = "product"

    product_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    product_name = db.Column(db.String)
    # plan here what you want in this table
    user_id = db.Column(db.Integer, db.ForeignKey(User.user_id))

Как видите, класс Product связан с User с foreignKey.

Результат:

Но я снова использую ту же команду для переноса, результат выглядит примерно так:

INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.env] No changes in schema detected.

Похоже, что не обнаружил новую таблицу из моего нового файла.

Мой вопрос:

Как создать отдельный файл для создания другой таблицы базы данных?

1 Ответ

0 голосов
/ 02 февраля 2019

Я думаю, что проблема в том, что модели не импортируются, а это означает, что SQLAlchemy и Alembic не знают о них.

Это нелогично для некоторых людей, но SQLAlchemy использует самоанализ, чтобы выяснить, чтомодели определены, поэтому во многих случаях решение вашей проблемы состоит в том, чтобы просто импортировать модели в ваш основной скрипт, даже если вам не нужно их использовать.Их импорт сделает их видимыми для SQLAlchemy и Alembic, и оттуда все будет хорошо работать.

В вашем случае вам просто нужно добавить что-то вроде следующего в manage.py:

from model.user import User
from model.product import Product

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

...