2014-10-08 71 views
3

我在創建初始遷移時會遇到問題,該遷移會自動在我的models.py中使用共享Base(declarative_base)定義的表。Alembic - sqlalchemy初始遷移

當我輸入命令:

alembic revision --autogenerate 

蒸餾器創建一個空文件。

我的配置或我的方法有什麼問題?

project.base.py:

from sqlalchemy.ext.declarative import declarative_base 


Base = declarative_base() 

env.py:

import sys 
import os 

sys.path.append(os.path.abspath(os.getcwd())) 
from alembic import context 
from sqlalchemy import engine_from_config, pool 
from logging.config import fileConfig 

from project.base import Base 
target_metadata = Base.metadata 
def run_migrations_online(): 
    """Run migrations in 'online' mode. 

    In this scenario we need to create an Engine 
    and associate a connection with the context. 

    """ 
    engine = engine_from_config(
     config.get_section(config.config_ini_section), 
     prefix='sqlalchemy.', 
     poolclass=pool.NullPool) 

    connection = engine.connect() 
    context.configure(
     connection=connection, 
     target_metadata=target_metadata 
    ) 

    # target_metadata.reflect(engine, only=[ 
    #  "django_migrations", 
    #  "auth_group_permissions", 
    #  "django_session", 
    #  "auth_user_user_permissions", 
    #  "auth_user_groups", 
    #  "django_admin_log", 
    #  "auth_permission", 
    #  "auth_user", 
    #  "sysdiagrams", 
    #  "django_content_type", 
    #  "auth_group", 
    #  "sysdiagrams", 
    # ]) 

    try: 
     with context.begin_transaction(): 
      context.run_migrations() 
    finally: 
     connection.close() 


if context.is_offline_mode(): 
    run_migrations_offline() 
else: 
    run_migrations_online() 

樣品型號:

# -*- coding: utf-8 -*- 

from sqlalchemy import Column, Integer, String, DateTime, Boolean, ForeignKey, SmallInteger 
from sqlalchemy.orm import relationship, backref 
from project.base import Base 


__schema__ = "Users" 


class User(Base): 
    __tablename__ = "User" 
    __table_args__ = {'schema': __schema__} 

    USER_CUSTOMER = 0 
    USER_EMPLOYEE = 5 
    USER_ADMIN = 10 

    USER_TYPES = (
     (USER_CUSTOMER, u'Klient'), 
     (USER_EMPLOYEE, u'Obsługa sklepu'), 
     (USER_ADMIN, u'Administrator') 
    ) 

    id = Column(Integer, primary_key=True) 
    name = Column(String(255)) 
    email = Column(String(255)) 
    password = Column(String) 
    date_created = Column(DateTime) 
    date_updated = Column(DateTime) 
    user_type = Column(SmallInteger) 

    is_active = Column(Boolean) 

    def __repr__(self): 
     return u"<User: ({} {})>".format(self.id, self.name) 

    def is_management(self): 
     return self.user_type in [self.USER_EMPLOYEE, self.USER_ADMIN] 

    def is_admin(self): 
     return self.user_type == self.USER_ADMIN 

編輯:

我發現基地.metadata.sorted_tables是空的。

回答

7

除了導入聲明性的Base類之外,還需要導入所有模型。像import project.models或任何你必須包含的模塊,以便所有的模型類都被導入。否則,您的Base.metadata不會填充您的模型定義,因爲env.py從不包含它們。

+0

太棒了!這就是訣竅! – Efrin 2014-10-09 06:26:42