1

나는 Flask mega tutorial을 따르고 있습니다. 기하학 열을 데이터베이스에 추가 할 때까지는 모두 잘 돌아갔습니다. 위치는 Post 클래스에 있습니다.SQLAlchemy-Migrate에서 기하학 열을 추가하는 마이그레이션 스크립트를 만드는 방법은 무엇입니까?

#! 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를 실행하고 다음 오류가 발생했습니다. 나는이 시간을 어떻게 해야할지 아무 생각이

#!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)) 

: 여기

sqlalchemy.exc.OperationalError: (OperationalError) near "POINT": syntax error u'\nALTER TABLE post ADD location geometry(POINT,-1)'() 

는 db_upgrade.py 코드입니다.

제 질문은 : 1. "/versions/%03d_migration.py"가 클래스 기하학을 자동으로 가져올 수 있도록 db_migrate.py를 변경할 수 있습니까? 2. 1에 관계없이 기하학 열을 추가하고 데이터베이스를 마이그레이션하는 방법은 무엇입니까?

감사합니다 ~!

+0

어떤 데이터베이스를 사용하고 있습니까? GeoAlchemy2는 PostgreSQL/PostGIS 만 지원합니다. – dirn

+1

@dim 좋은 지적입니다. 나는 sqlite를 사용하고 있었다. 하지만 PostgreSQL/PostGIS에서 모든 것을 다시 시도했습니다. db_migrate.py는 여전히 "name"오류를 제공합니다. 기하학이 "정의되지 않았습니다". sqlalchemy-migrate가 2012 년에 geoalchemy를 지원하지 않는다는 일부 게시물을 발견했습니다. 여전히 사실입니까? 이 경우 sqlalchemy-migrate를 대체 할 수있는 것은 무엇입니까? 고마워 ~! –

답변

2

Miguel Grinberg의 지침서를 따르는 경우 SQLite 데이터베이스를 사용하고 있습니다.

GeoAlchemy2 - 내가 잘못하지 않았다면, @dirn이 주석에서 지적했듯이 PostgreSQL/PostGIS 만 지원합니다.

해결책은 PostgreSQL 서버를 실행시키는 것입니다. SQLAlchemy는 PostreSQL을 잘 다룹니다.

일단 알았 으면 config.pySQLALCHEMY_DATABASE_URI ~ postgres://...으로 수정하면 올바르게 작동합니다.

UPDATE 그냥 @dirn 귀하의 회신을 보았다. SQLAlchemy-Migrate는 버려진 것입니다. 올바른 작업은 Flask-MigrateAlembicFlask-Script을 사용하는 것입니다. 초보자라면 약간의 부담이 있지만 그만한 가치가 있습니다.

+0

매우 명확한 대답입니다. Flask-Migrate 또는 Alembic이 지오알 매시를 지원한다고 생각하십니까? 다른 사람들이 내가 한 것과 같은 시점에 이르렀을 경우, 그 다음 정류장이 있습니다 : [Flask-Migrate tutorial] (http://blog.miguelgrinberg.com/post/flask-migrate-alembic-database-migration-wrapper-for -flask) –

+0

나는 정말로 확신하지 못한다. 그러나 나는 그렇게 말할 것이다. 것은 GeoAlchemy2가 SQLAlchemy 0.7 (또는 기타)를 지원하지 않는다는 것입니다. SQLALchemy는 오늘 버전 1.0입니다. Alembic은 최신 버전의 SQLAlchemy (1,0, 0.9, 0.8 ...)에서 작동합니다.Geoalchemy가 SQLAlchemy _extention _이므로, 나는 그들이 대부분의 업데이트 된 버전에서 잘 따라 가야한다고 생각합니다 ... – cuducos

+0

나는 Flask-Migrate (alembic에 대한 래퍼)를 추천하려고했습니다. 하지만 자동으로 GeoAlchemy2를 가져 오지는 않습니다. 필요한 각 마이그레이션에'import geoalchemy2'를 추가해야합니다. alembic이 가능한 모든 SQLAlchemy 확장을 인식하기가 어렵 기 때문에 SQLAlchemy에서 직접 지원하지 않는 유형을 사용하는 모든 것은 약간의 수동 개입이 필요합니다. – dirn