2016-09-07 1 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の2つの定義を持っていますか? 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

関連する問題