У меня есть веб-приложение, написанное на python с использованием Flask и sqlalchemy. Это приложение работает на Heroku, и как работник я использую расширение металлиста, у меня есть все мои модели, определенные в модели модуля, как это:Использование декларации sqlalchemy во внешнем работнике
from app import db
class Player(db.Model):
__tablename__ = 'players'
id = db.Column(db.Integer, primary_key=True)
....
type = db.Column(db.String(50))
def __init__(self, ....):
....
__mapper_args__ = {
'polymorphic_identity':'player',
'polymorphic_on':type
}
class Outfielder(Player):
__tablename__ = 'outfielders'
id = db.Column(db.Integer, db.ForeignKey('players.id'), primary_key=True)
__mapper_args__ = {
'polymorphic_identity':'outfielder'
}
class Goalkeeper(Player):
__tablename__ = 'goalkeepers'
id = db.Column(db.Integer, db.ForeignKey('players.id'), primary_key=True)
__mapper_args__ = {
'polymorphic_identity':'goalkeeper'
}
(Обратите внимание, как этот импорт БД из приложения) я могу создавать экземпляры этих моделей в моем приложении, инстанцировании модели, например, так:
db = SQLAlchemy(app)
gk = models.Goalkeeper('John', 'Snow', 1, 1, 3456, 67, 55, 187)
of = models.Outfielder('Gary', 'Lineker', 1, 1, 3999, 77, 78, 176)
db.session.add(gk)
db.session.add(of)
db.session.commit()
Теперь, что я хотел бы сделать это, чтобы иметь возможность создавать экземпляры этих моделей на мой внешний работника. Единственное, что мешает мне сделать это, - это зависимость от моего модуля приложения. Я не чувствую, что эта зависимость оправдана и хотела бы найти лучший подход к дизайну, чтобы иметь возможность просто экспортировать мой модуль в рабочий экземпляр рабочего и init sqlalchemy и создавать экземпляры моих моделей и сохранять их в базе данных точно так же Точно так же я могу сделать это в самом приложении.
Обратите внимание, что я уже могу получить доступ к своей базе данных от работника, как это:
db = create_engine(db_url)
metadata = MetaData(db)
print "connection to the database established"
players = Table('players', metadata, autoload=True)
s = players.select()
Я просто ищу лучший способ отражения моей структуры модели на работнике. В частности, я думаю о сценарии, когда мои модели меняются, и мне придется поддерживать код на обоих концах отдельно. Если мне удастся повторно использовать модели и использовать декларативные на обоих концах, то на стороне рабочего не будет никакого обслуживания, что бы это ни было.
Вероятно, лучший способ определить ваши модели отдельно от Колба-SQLAlchemy и позволяют колбовую SQLAlchemy использовать модели, определенные в отдельном модуле, а не использовать Flask-SQLAlchemy, чтобы вы использовали встроенную базу данных db.Model. К сожалению, дизайн Flask-SQLAlchemy не позволяет этого легко, проблема, которая, мы надеемся, будет рассмотрена в следующей версии (https://github.com/mitsuhiko/flask-sqlalchemy/issues/98). См. [Этот вопрос] (http://stackoverflow.com/questions/19119725/how-to-use-flask-sqlalchemy-with-existing-sqlalchemy-model). –