2016-09-07 39 views
0

我正在編寫我的第一個Python Web應用程序,並且我想使用alembic來處理遷移。到目前爲止,我已經完成了這個工作(只是指出了imp文件),它似乎並不奏效。Python 2.7中集成龍捲風(4.4.1),sqlalchemy(1.1.0)和alembic(0.8.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