1

Flask mega tutorialに従っています。Geometry 列をデータベースに追加しようとするまでは、すべてうまくいきました。location と呼ばれる 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」に、ジオメトリがインポートされていないことがわかりました。だから私は追加しました

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. "/versions/%03d_migration.py" がクラス Geometry を自動的にインポートするように、db_migrate.py に加えることができる変更はありますか? 2. 1 に関係なく、ジオメトリ列を追加してデータベースを移行する方法を教えてください。

どうもありがとう〜!

4

1 に答える 1

2

Miguel Grinberg のチュートリアルに従っている場合は、SQLite データベースを使用しています。

GeoAlchemy2 – 私が間違っていなければ – @dirn がコメントで指摘したように、PostgreSQL/PostGIS のみをサポートしています。

解決策は、PostgreSQL サーバーを稼働させることです。SQLAlchemy は PostreSQL をうまく処理します。

取得したら、ポイントを編集するだけconfig.pySQLALCHEMY_DATABASE_URI機能postgres://...するはずです。

アップデート

@dirn への返信を見ました。SQLAlchemy-Migrate は放棄されたようなものです。正しいことは、Flask-MigrateAlembicおよびFlask-Scriptと共に使用することです。初心者には少し負担がかかりますが、その価値はあります。

于 2014-12-18T10:21:27.420 に答える