Как создать сценарий миграции для добавления столбца Geometry в SQLAlchemy-Migrate?
Я следую мега-учебнику Flask. Все работало хорошо, пока я не попытался добавить столбец Geometry в базу данных. Обратите внимание, что это в классе Post, который называется location.
#! model.py
from app import db
from geoalchemy2 import Geometry
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
nickname = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
posts = db.relationship('Post', backref='author', lazy='dynamic')
def __repr__(self):
return '<User %r>' % (self.nickname)
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.String(140))
timestamp = db.Column(db.DateTime)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
location = db.Column(Geometry('POINT'))
def __repr__(self):
return '<Post %r>' % (self.body)
Затем я использовал файл db_migrate.py, приведенный в учебном пособии, но получил сообщение о том, что имя "Геометрия" не определено. Вот код в db_migrate.py:
#!flask/bin/python
import imp
from migrate.versioning import api
from app import db
from config import SQLALCHEMY_DATABASE_URI
from config import SQLALCHEMY_MIGRATE_REPO
v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
migration = SQLALCHEMY_MIGRATE_REPO + ('/versions/%03d_migration.py' % (v+1))
tmp_module = imp.new_module('old_model')
old_model = api.create_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
exec(old_model, tmp_module.__dict__)
script = api.make_update_script_for_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, tmp_module.meta, db.metadata)
open(migration, "wt").write(script)
api.upgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
print('New migration saved as ' + migration)
print('Current database version: ' + str(v))
Затем я нашел в файле "/versions/%03d_migration.py", который сгенерирован с помощью вышеуказанных кодов, геометрия не была импортирована. Итак, я добавил
from geoalchemy2 import Geometry
вручную, затем я запустил db_update.py и получил следующую ошибку.
sqlalchemy.exc.OperationalError: (OperationalError) near "POINT": syntax error u'\nALTER TABLE post ADD location geometry(POINT,-1)' ()
Вот код для db_upgrade.py:
#!flask/bin/python
from migrate.versioning import api
from config import SQLALCHEMY_DATABASE_URI
from config import SQLALCHEMY_MIGRATE_REPO
api.upgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
print('Current database version: ' + str(v))
Я понятия не имею, что делать в этот раз.
Поэтому мой вопрос: 1. Могу ли я внести какие-либо изменения в db_migrate.py, чтобы "/versions/%03d_migration.py" автоматически импортировал класс Geometry? 2. Независимо от 1, как добавить столбец геометрии и перенести базу данных?
Большое спасибо ~!
1 ответ
Если вы следуете учебнику Мигеля Гринберга, вы используете базу данных SQLite.
GeoAlchemy2 - если я не ошибаюсь - поддерживает только PostgreSQL/PostGIS, как отметил @dirn в комментарии.
Решением было бы запустить сервер PostgreSQL. SQLAlchemy прекрасно работает с PostreSQL.
Как только вы его получили, просто отредактируйте config.py
указательный SQLALCHEMY_DATABASE_URI
в postgres://...
и это должно работать.
ОБНОВИТЬ
Только что видел твой ответ на @dirn. SQLAlchemy-Migrate является заброшенным. Правильнее всего было бы использовать Flask-Migrate с Alembic и Flask-Script. Немного бремени, если вы новичок, но оно того стоит.