在 Python 2.7 中集成 tornado (4.4.1)、sqlalchemy (1.1.0) 和 alembic (0.8.7)

Integrating tornado (4.4.1), sqlalchemy (1.1.0) and alembic (0.8.7) in Python 2.7

我正在编写我的第一个 Python Web 应用程序,我想使用 alembic 来处理迁移。到目前为止,我已经这样做了(只是指出了 imp. 文件),但它似乎没有用。

项目结构:

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)

实现此目的最干净的方法是什么?

坦率地说,我不太明白你想做什么。但是部分代码看起来完全错误。为什么你有两个 User 的定义?你想用 id = user_table.c.id 达到什么目的?我只能猜测。首先,在某处定义 table schema:

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)

并且您不需要在其他文件中重新定义它。仅导入并使用。