나는 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에 관계없이 기하학 열을 추가하고 데이터베이스를 마이그레이션하는 방법은 무엇입니까?
감사합니다 ~!
어떤 데이터베이스를 사용하고 있습니까? GeoAlchemy2는 PostgreSQL/PostGIS 만 지원합니다. – dirn
@dim 좋은 지적입니다. 나는 sqlite를 사용하고 있었다. 하지만 PostgreSQL/PostGIS에서 모든 것을 다시 시도했습니다. db_migrate.py는 여전히 "name"오류를 제공합니다. 기하학이 "정의되지 않았습니다". sqlalchemy-migrate가 2012 년에 geoalchemy를 지원하지 않는다는 일부 게시물을 발견했습니다. 여전히 사실입니까? 이 경우 sqlalchemy-migrate를 대체 할 수있는 것은 무엇입니까? 고마워 ~! –