【问题标题】:Integrating tornado (4.4.1), sqlalchemy (1.1.0) and alembic (0.8.7) in Python 2.7在 Python 2.7 中集成 tornado (4.4.1)、sqlalchemy (1.1.0) 和 alembic (0.8.7)
【发布时间】:2017-01-14 22:37:15
【问题描述】:

我正在编写我的第一个 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)

实现这一目标的最简洁方法是什么?

【问题讨论】:

    标签: python-2.7 sqlalchemy tornado alembic


    【解决方案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)
    

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

    【讨论】:

    • 嘿,谢谢。我将代码更改为您建议的第一种方法(使用 user_schema 变量),并且正在使用 alembic 的自动生成开关来生成迁移。现在就像一个魅力。
    猜你喜欢
    • 2013-02-08
    • 2016-05-17
    • 2017-01-08
    • 2019-07-13
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多