gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:37:27 26 4
gpt4 key购买 nike

我正在关注 Flask mega tutorial 。一切都很顺利,直到我尝试向数据库添加几何列。注意它在 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,但出现错误,提示名称“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,如何添加几何列并迁移数据库?

非常感谢~!

最佳答案

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

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

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

一旦你得到它,只需编辑你的config.py,将SQLALCHEMY_DATABASE_URI指向postgres://...,它就应该可以工作。

更新

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

关于flask - 如何创建迁移脚本以在 SQLAlchemy-Migrate 中添加几何列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27531569/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com