2013-10-11 1 views
12

나는 파일 listpull/models.py에서 다음 모델 한 : 나는 다음 ./run.py init 다음 ./run.py migrate./run.py upgrade플라스크-마이그레이션 작성하지 테이블

from datetime import datetime 

from listpull import db 


class Job(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    list_type_id = db.Column(db.Integer, db.ForeignKey('list_type.id'), 
          nullable=False) 
    list_type = db.relationship('ListType', 
           backref=db.backref('jobs', lazy='dynamic')) 
    record_count = db.Column(db.Integer, nullable=False) 
    status = db.Column(db.Integer, nullable=False) 
    sf_job_id = db.Column(db.Integer, nullable=False) 
    created_at = db.Column(db.DateTime, nullable=False) 
    compressed_csv = db.Column(db.LargeBinary) 

    def __init__(self, list_type, created_at=None): 
     self.list_type = list_type 
     if created_at is None: 
      created_at = datetime.utcnow() 
     self.created_at = created_at 

    def __repr__(self): 
     return '<Job {}>'.format(self.id) 


class ListType(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(80), unique=True, nullable=False) 

    def __init__(self, name): 
     self.name = name 

    def __repr__(self): 
     return '<ListType {}>'.format(self.name) 

전화, 나는 생성 된 마이그레이션 파일을 볼 수 있지만, 그 빈 :

"""empty message 

Revision ID: 5048d48b21de 
Revises: None 
Create Date: 2013-10-11 13:25:43.131937 

""" 

# revision identifiers, used by Alembic. 
revision = '5048d48b21de' 
down_revision = None 

from alembic import op 
import sqlalchemy as sa 


def upgrade(): 
    ### commands auto generated by Alembic - please adjust! ### 
    pass 
    ### end Alembic commands ### 


def downgrade(): 
    ### commands auto generated by Alembic - please adjust! ### 
    pass 
    ### end Alembic commands ### 

run.py

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

from listpull import manager 
manager.run() 
012 3,516,

listpull/__ init__.py

# -*- coding: utf-8 -*- 
# pylint: disable-msg=C0103 

""" listpull module """ 

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 
from flask.ext.script import Manager 
from flask.ext.migrate import Migrate, MigrateCommand 
from mom.client import SQLClient 
from smartfocus.restclient import RESTClient 


app = Flask(__name__) 
app.config.from_object('config') 

db = SQLAlchemy(app) 

migrate = Migrate(app, db) 

manager = Manager(app) 
manager.add_command('db', MigrateCommand) 

mom = SQLClient(app.config['MOM_HOST'], 
       app.config['MOM_USER'], 
       app.config['MOM_PASSWORD'], 
       app.config['MOM_DB']) 

sf = RESTClient(app.config['SMARTFOCUS_URL'], 
       app.config['SMARTFOCUS_LOGIN'], 
       app.config['SMARTFOCUS_PASSWORD'], 
       app.config['SMARTFOCUS_KEY']) 

import listpull.models 
import listpull.views 

UPDATE

내가 ./run.py shell를 통해 쉘을 실행 한 다음 from listpull import *을하고 db.create_all()를 호출하는 경우, 내가 스키마 얻을 :

[email protected]:~/code/nhs-listpull$ sqlite3 app.db 
-- Loading resources from /Users/mark.richman/.sqliterc 
SQLite version 3.7.12 2012-04-03 19:43:07 
Enter ".help" for instructions 
Enter SQL statements terminated with a ";" 
sqlite> .schema 
CREATE TABLE job (
    id INTEGER NOT NULL, 
    list_type_id INTEGER NOT NULL, 
    record_count INTEGER NOT NULL, 
    status INTEGER NOT NULL, 
    sf_job_id INTEGER NOT NULL, 
    created_at DATETIME NOT NULL, 
    compressed_csv BLOB, 
    PRIMARY KEY (id), 
    FOREIGN KEY(list_type_id) REFERENCES list_type (id) 
); 
CREATE TABLE list_type (
    id INTEGER NOT NULL, 
    name VARCHAR(80) NOT NULL, 
    PRIMARY KEY (id), 
    UNIQUE (name) 
); 
sqlite> 

을 아쉽게도 마이그레이션은 여전히 ​​작동하지 않습니다.

답변

10

migrate Flask-Migrate (실제로는 Alembic) 명령을 호출하면 models.py이 실제로 데이터베이스에있는 것과 비교됩니다.

빈 마이그레이션 스크립트가 있다는 사실은 Flask-Migrate의 컨트롤 외부에있는 다른 방법 (예 : Flask-SQLAlchemy의 db.create_all())을 사용하여 모델을 모델에 맞게 업데이트했음을 의미합니다.

데이터베이스에 중요한 데이터가 없으면 Python 셸을 열고 db.drop_all()을 호출하여 데이터를 비운 다음 자동 마이그레이션을 다시 시도하십시오.

UPDATE는 :

(venv)[[email protected] nhs-listpull]$ ./run.py db init 
    Creating directory /home/miguel/tmp/mark/nhs-listpull/migrations...done 
    Creating directory /home/miguel/tmp/mark/nhs-listpull/migrations/versions...done 
    Generating /home/miguel/tmp/mark/nhs-listpull/migrations/script.py.mako...done 
    Generating /home/miguel/tmp/mark/nhs-listpull/migrations/env.pyc...done 
    Generating /home/miguel/tmp/mark/nhs-listpull/migrations/env.py...done 
    Generating /home/miguel/tmp/mark/nhs-listpull/migrations/README...done 
    Generating /home/miguel/tmp/mark/nhs-listpull/migrations/alembic.ini...done 
    Please edit configuration/connection/logging settings in 
    '/home/miguel/tmp/mark/nhs-listpull/migrations/alembic.ini' before 
    proceeding. 
(venv)[[email protected] nhs-listpull]$ ./run.py db migrate 
INFO [alembic.migration] Context impl SQLiteImpl. 
INFO [alembic.migration] Will assume non-transactional DDL. 
INFO [alembic.autogenerate] Detected added table 'list_type' 
INFO [alembic.autogenerate] Detected added table 'job' 
    Generating /home/miguel/tmp/mark/nhs- 
    listpull/migrations/versions/48ff3456cfd3_.py...done 

는 신선한 체크 아웃을 시도 나는 당신의 설정이 올바른지 생각 : 나는 마이그레이션 나를 위해 잘 작동하는지 여기에 프로젝트를 설치하고 확인했다.

+0

나는 app.db와 migrations 디렉토리를 삭제하고 프로세스를 반복했다. 같은 효과 : (http://paste2.org/1Vf7Ixyb –

+0

'run.py'와'listpull/__ init __. py' 파일을 질문에 추가 할 수 있습니까? – Miguel

+0

완료 ........... –

3

방금 ​​비슷한 문제가 발생했습니다. 이 스레드가 발생하는 다른 모든 사람들을 위해 내 솔루션을 공유하고 싶습니다. 나에게는 내 모델이 패키지로 들어 있었다. 예를 들어, models/user.py와 나는 from app.models import *을 시도했으나 마이그레이션에서 아무 것도 탐지하지 못했습니다. 그러나 가져 오기를 from app.models import user으로 변경하면 내 프로젝트가 어째서 괜찮습니까?하지만 더 많은 모델을 보유하고 있으므로 대량 가져 오기가 바람직합니다. 내 문제는 증류기의 지식없이 새 테이블을 만들어 내 주요 플라스크 응용 프로그램 파일 에

db.create_all()

을 가졌다

이 건너 오는 오는 사람들을위한
3

간단하게 주석 또는 완전히 삭제하여 향후 마이그레이션을 망칠 필요가 없습니다.

그러나 @ Miguel의 제안과 달리 전체 데이터베이스를 삭제하는 대신 (중요한 정보가 있음) Flask SQLAlchemy로 만든 새 테이블을 삭제 한 다음 마이그레이션을 실행하여 문제를 해결할 수있었습니다.

이 시간 증류기는 새 테이블을 감지하고 적절한 마이그레이션 스크립트

3

을 만든 manage.py 파일 (또는 마이그레이션 인스턴스 파일)의 모델을 가져올 수 있는지 확인합니다. 모델을 명시 적으로 사용하지 않아도 파일에서 모델을 가져와야합니다. Alembic은 이러한 가져 오기가 마이 그 레이션되고 데이터베이스에 테이블을 생성해야합니다. 예를 들면 :

# ... some imports ... 
from api.models import User, Bucketlist, BucketlistItem # Import the models 

app = create_app('dev') 
manager = Manager(app) 
migrate = Migrate(app, db) 

manager.add_command('db', MigrateCommand) 

# ... some more code here ... 

if __name__ == "__main__": 
    manager.run() 
    db.create_all() 
+1

이것은 올바른 대답이 아닌 방법은 무엇입니까? – codyc4321

+0

나는이 예제를 따르고 있었고 (그것없이 시작한 후) 동일한 issue.https를 가지고 있었다 : //realpython.com/blog/python/flask-by-example-part-2-postgres-sqlalchemy-and-alembic/ 작가 실제로 무슨 문제가 있었는지 알지 못해서 이후의 수업에서이 문제를 수정했습니다. 이것이 정답입니다. – SWoo