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

Flask 如何创建迁移脚本以在SQLAlchemy Migrate中添加几何体列?,flask,flask-sqlalchemy,sqlalchemy-migrate,flask-migrate,geoalchemy2,Flask,Flask Sqlalchemy,Sqlalchemy Migrate,Flask Migrate,Geoalchemy2,我在跟踪调查。在我尝试向数据库中添加几何体列之前,一切都很顺利。注意,它位于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

我在跟踪调查。在我尝试向数据库中添加几何体列之前,一切都很顺利。注意,它位于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)
然后我发现在由上述代码生成的文件“/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数据库

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

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

一旦你得到它,只需编辑你的
config.py
指向
SQLALCHEMY\u数据库\u URI
postgres://...
,它应该可以工作

更新


刚刚看到你对@dirn的回复。SQLAlchemy有点被抛弃了。正确的做法是使用和。如果您是初学者,这会给您带来一点负担,但这是值得的。

您使用的是什么数据库?GeoAlchemy2只支持PostgreSQL/PostGIS。@这是一个很好的观点。我使用的是sqlite。但后来我又在PostgreSQL/PostGIS上尝试了一切。db_migrate.py仍然给出错误“名称”几何体“未定义”。我在2012年发现一些帖子说sqlalchemy迁移不支持地理炼金术。这仍然是真的吗?在这种情况下,什么是sqlalchemy迁移的好替代品?非常感谢~!答案很清楚。你认为阿兰比克或阿兰比克支持地球炼金术吗?如果其他人和我有相同的观点,这里是下一站:我真的不确定,但我可以这么说。问题是GeoAlchemy2不支持SQLAlchemy0.7(或oder)。SQLALchemy今天的版本是1.0。Alembic使用SQLAlchemy的这些最新版本(1,0,0.9,0.8…)。由于Geoalchemy是SQLAlchemy的扩展,我相信他们在大多数更新版本中都会相处得很好……我打算推荐Flask Migrate(它是alembic的包装器)。不过,它不会自动引入地球炼金术2。您仍然需要将
import geoalchemy2
添加到每个需要它的迁移中。alembic很难知道所有可能的SQLAlchemy扩展,因此任何使用SQLAlchemy不直接支持的类型的东西都需要一些手动干预。@dim我将“import geoalchemy2”放入脚本模板文件“script.py.mako”中。因此,无需对每次迁移进行更改。现在一切正常:)
#!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))