Flask проблема с автоматом SQLAlchemy - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть автомат для работы с существующей базой данных в моем проекте приложения. Когда я запускаю его на своей p c с помощью команды flask run, он работает нормально и сохраняет данные в базе данных. Теперь я пытаюсь разместить свое приложение на сервере Debian. Когда я запускаю приложение с gunicorn, оно возвращает мне эту ошибку:

sqlalchemy.exc.ArgumentError: Mapper mapped class Applications->applications could not assemble any primary key columns for mapped table 'applications'.

Это мои models.py:

from flask_login import UserMixin
from sqlalchemy import Column, Date, Integer, String, create_engine
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.ext.automap import automap_base

Base = automap_base()

class User(UserMixin, Base, db.Model):
    __tablename__ = "accounts"

    def __repr__(self):
        return "User {}".format(self.acc_username)

    def get_id(self):
           return (self.acc_id)

class Char(Base, db.Model):
    __tablename__ = "characters"

    def __repr__(self):
        return self.char_name.replace('_',' ')

class Applications(Base, db.Model):
    __tablename__="applications"

    def __repr__(self):
        return "Application ".format(self.id)

Base.prepare(db.engine, reflect=True)

@login.user_loader
def load_user(id):
    return User.query.get(int(id))

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

Это объявление БД:

db = SQLAlchemy(app)

Конфигурация базы данных:

SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
        'sqlite:///' + os.path.join(basedir, 'app.db')

URL базы данных:

DATABASE_URL=mysql+pymysql://root:xxxx@localhost:3306/xxxx

1 Ответ

0 голосов
/ 05 февраля 2020

Без объявления ваших столбцов, ключей и индексов в кодовой базе это может привести к таким случаям, если вы переходите с SQLLite на MySQL или, например, с локального на сервер (по крайней мере из моего предыдущего опыта)

В вашем случае я бы сделал одну из следующих вещей:

  1. Примените улучшенную функциональность автомата в соответствии с документацией (возможно, с отражениями): https://docs.sqlalchemy.org/en/13/orm/extensions/automap.html

  2. перепроектировать структуру БД, ключи и отношения в модели вручную или с помощью некоторых инструментов, таких как sqlacodegen url: https://pypi.org/project/sqlacodegen/

  3. Мои предпочтения: Go с flask перенести для лучшего удобства и описать все ваши модели, ключи, отношения, индексы в коде URL: https://flask-migrate.readthedocs.io/en/latest/ Описание ваших моделей лучше и в полном объеме как начать миграцию со стороны flask, это разумный способ организовать и иметь хорошие результаты каждый раз.

...