Использование Flask моделей SQLAlchemy с обычной SQLAlchemy - PullRequest
1 голос
/ 29 января 2020

У меня есть существующая модель, которую я не могу изменить, написанная на Flask -SQLAlchemy. Я пишу другое приложение, которое использует ту же модель, но без необходимости Flask, поэтому я работаю с обычным модулем SQLAlchemy. К сожалению, я получаю много: «AttributeError: модуль« DB »не имеет атрибута« Model »для всех видов атрибутов - таких как Column, Integer и т. Д. Есть ли способ использовать Flask -SQLAlchemy с обычным Приложение SQLAlchemy?

Есть пример одного из моих классов моделей:

class Table_name(Model):
    __tablename__ = 'table_name'
    id = db.Column(db.INTEGER, primary_key=True)
    field1 = db.Column(db.INTEGER, db.ForeignKey('table1.id'), nullable=False)
    field2 = db.Column(db.TEXT, nullable=False)
    field3 = db.Column(db.INTEGER, db.ForeignKey('table2.id'), nullable=False)
    time = db.Column(db.TIMESTAMP, nullable=False)

К сожалению, я не могу их изменить

Ответы [ 2 ]

0 голосов
/ 30 января 2020
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String, Text, TIMESTAMP, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker


Base = declarative_base()

#  connect in memory sqlite database or you can connect your own database
engine = create_engine('sqlite:///:memory:', echo=True)

# create session and bind engine
Session = sessionmaker(bind=engine)


class Table_name(Base):
    __tablename__ = 'table_name'
    id = Column(Integer, primary_key=True)
    field1 = Column(Integer, ForeignKey('table1.id'), nullable=False)
    field2 = Column(Text, nullable=False)
    field3 = Column(Integer, ForeignKey('table2.id'), nullable=False)
    time = Column(TIMESTAMP, nullable=False)

table = Table_name(field1=1, fi....)
session.add(table)

Теперь вы можете использовать ORM как обычно, как flask -sqlalchemy.

Документы: https://docs.sqlalchemy.org/en/13/orm/tutorial.html

0 голосов
/ 30 января 2020

У меня была та же самая дилемма. Если он маленький или одноразовый, вы можете взломать объект приложения Flask, не используя его по-настоящему, например:

from flask_sqlalchemy import SQLAlchemy

throw_away_app = Flask(__name__)
db = SQLAlchemy(throw_away_app)
with self.throw_away_app.app_context():
    (perform your db operation)

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

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

Кстати, для любых будущих программистов, задающихся вопросом, как получить некоторые из преимуществ Flask -SQLAlchemy без Flask, рассмотрим: sqlalchemy-mixins .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...