首页 文章

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

提问于
浏览
1

我跟着Flask mega tutorial . 在我尝试将Geometry列添加到数据库之前,这一切都运行良好 . 请注意,它位于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,但是出现了一个错误,说没有定义名称“Geometry” . 这是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”中找到了Geometry,但是没有导入 . 所以我补充道

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 回答

  • 2

    如果您正在关注Miguel Grinberg的教程,那么您正在使用SQLite数据库 .

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

    解决方案是运行PostgreSQL服务器 . SQLAlchemy处理PostreSQL很好 .

    一旦你得到它,只需编辑你的 config.py 指向 SQLALCHEMY_DATABASE_URIpostgres://... 它应该工作 .

    UPDATE

    刚刚看到你对@dirn的回复 . SQLAlchemy-Migrate有点被遗弃了 . 正确的做法是使用Flask-MigrateAlembicFlask-Script . 如果你是一个初学者,有点负担,但值得 .

相关问题