如何创建迁移脚本以在 SQLAlchemy-Megg 中添加几何列



我正在关注Flask大型教程。在我尝试向数据库添加几何列之前,一切都运行良好。请注意,它位于 Post 类中,称为位置。

#! 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"将自动导入类几何?2. 不管 1,如何添加几何列并迁移数据库?

多谢~!

如果您遵循Miguel Grinberg的教程,那么您使用的是SQLite数据库。

GeoAlchemy2 - 如果我没记错的话 - 仅支持PostgreSQL/PostGIS,正如@dirn在评论中指出的那样。

解决方案是运行PostgreSQL服务器。SQLAlchemy 可以很好地处理 PostreSQL。

获得它后,只需编辑config.py SQLALCHEMY_DATABASE_URI指向postgres://...,它应该可以工作。

更新

刚刚看到你对@dirn的回复。SQLAlchemy-Migrate 有点被抛弃了。正确的做法是使用Flask-Migrate,以及Alembic和Flask-Script。如果您是初学者,这有点负担,但值得。

最新更新