我跟随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,但是出现了一个错误,名称为&#34; Geometry&#34;没有定义。这是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))
然后我在文件中找到&#34; /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进行任何更改,以便&#34; /versions/%03d_migration.py"会自动导入Geometry类吗? 2.无论1,如何添加几何列并迁移数据库?
非常感谢〜!
答案 0 :(得分:2)
如果您正在关注Miguel Grinberg的教程,那么您正在使用SQLite数据库。
GeoAlchemy2 - 如果我没错 - 只支持PostgreSQL / PostGIS,正如@dirn在评论中指出的那样。
解决方案是运行PostgreSQL服务器。 SQLAlchemy处理PostreSQL很好。
一旦你得到它,只需编辑config.py
指向SQLALCHEMY_DATABASE_URI
到postgres://...
,它就可以了。
<强>更新强>
刚刚看到你对@dirn的回复。 SQLAlchemy-Migrate有点被遗弃了。正确的做法是使用Flask-Migrate,Alembic和Flask-Script。如果你是初学者会有点负担,但是值得。