2016-09-07 4 views
0

Я пишу свое первое веб-приложение Python, и я хочу использовать alembic для обработки миграции. До сих пор я это делал (просто указывая на файлы imp.), И он, похоже, не работает.Интеграция торнадо (4.4.1), sqlalchemy (1.1.0) и alembic (0.8.7) в Python 2.7

Структура проекта:

project/ 
    alembic.ini 
    alembic/ 
     versions/ 
      3cd4a4f9cdef_create_users_table.py 
    models/ 
     __init__.py 
     base.py 
     users.py 

3cd4a4f9cdef_create_users_table.py

"""create users table 

Revision ID: 3cd4a4f9cdef 
Revises: 
Create Date: 2016-09-07 13:54:25.705084 

""" 

# revision identifiers, used by Alembic. 
revision = '3cd4a4f9cdef' 
down_revision = None 
branch_labels = None 
depends_on = None 

from alembic import op 
import sqlalchemy as sa 


def upgrade(): 
    op.create_table(
     'users', 
     Column('id', sa.Integer, primary_key=True), 
     Column('name', sa.String(256), nullable=False) 
    ) 


def downgrade(): 
    op.drop_table('users') 

__init__.py

from sqlalchemy import create_engine 
from sqlalchemy.sql import select 
from users import User 

engine = create_engine('sqlite:///:memory:', echo=True) 

base.py

from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

users.py

from base import Base 

class User(Base): 

    user_table = 'users' 
    __table__ = user_table 

    id = user_table.c.id 
    name = user_table.c.name 

$ python models/__init__.py выдает эту ошибку:

Traceback (most recent call last): 
    File "models/__init__.py", line 3, in <module> 
    from users import User 
    File "/Users/sudeep.agarwal/src/project/models/users.py", line 5, in <module> 
    class Asset(Base): 
    File "/Users/sudeep.agarwal/src/squiddy/models/users.py", line 10, in Asset 
    id = asset_table.c.id 
AttributeError: 'str' object has no attribute 'c' 

Я не хочу, чтобы сделать это в users.py, поскольку это означало бы дублирование определения схемы:

from base import Base 
from sqlalchemy import Column 

class User(Base): 

    __table__ = 'users' 

    id = Column('id', Integer, primary_key=True) 
    name = Column('name', String, nullable=False) 

Каков самый чистый способ достичь этого?

ответ

1

Честно говоря, я не совсем понимаю, что вы пытаетесь сделать. Но некоторые части кода выглядят совершенно неправильно. Почему у вас есть два определения: User? Чего вы пытаетесь достичь с помощью id = user_table.c.id? Я могу только догадываться. Во-первых, определить где-то схемы таблицы:

metadata = MetaData() 
users_schema = Table('users', metadata, 
    Column('id', Integer, primary_key=True), 
    Column('name', String, nullable=False) 
) 

Затем вы можете использовать его, чтобы определить модель:

class User(Base): 
    __table__ = users_schema 

Или вы можете определить модель непосредственно:

class User(Base): 
    __tablename__ = 'users' 

    id = Column('id', Integer, primary_key=True) 
    name = Column('name', String, nullable=False) 

И вы не нужно переопределять его в других файлах. Только импортируйте его и используйте.

+0

Не работает. Такая же ошибка. – draxxxeus

+0

Я обновил ответ. –

+0

Эй, спасибо. Я изменил код на первый метод (используя переменную user_schema), который вы предложили, и я использую автогенератор alembic для генерации миграции. Сейчас работает как шарм. – draxxxeus

 Смежные вопросы

  • Нет связанных вопросов^_^