在 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)
并且您不需要在其他文件中重新定义它。仅导入并使用。
我正在编写我的第一个 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)
并且您不需要在其他文件中重新定义它。仅导入并使用。