在使用SQLAlchemy创建表后,如何向其中添加其他列?

时间:2011-11-23 02:29:11

标签: mysql database orm sqlalchemy

到目前为止,这是我的文件:

from sqlalchemy import create_engine, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, backref
from sqlalchemy import Column, Integer, String
from sqlalchemy import Table, Text

engine = create_engine('mysql://root:ababab@localhost/alctest',
            echo=False)

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key = True)
    name = Column(String(100))
    fullname = Column(String(100))
    password = Column(String(100))
    addresses = relationship("Address", order_by="Address.id", backref="user")

    def __init__(self, name, fullname, password):
        self.name = name
        self.fullname = fullname
        self.password = password

    def __repr__(self):
        return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)


class Address(Base):
    __tablename__ = 'addresses'
    id = Column(Integer, primary_key = True)
    email_address = Column(String(100), nullable=False)

    #foreign key, must define relationship
    user_id = Column(Integer, ForeignKey('users.id'))
    user = relationship("User", backref = backref('addresses',order_by=id))

Base.metadata.create_all(engine)

这个文件非常简单。它创建一个用户和地址表。运行此文件后,将创建表。

但现在我想在“用户”中添加一列。我怎样才能做到这一点?我需要做什么?

2 个答案:

答案 0 :(得分:3)

您可以使用Table.append_column方法添加列。

test = Column('test', Integer)
User.__table__.append(test)

但是这不会触发ALTER TABLE命令在数据库中添加该列。根据{{​​1}}给出的文档,该命令必须在模型中添加该列后手动运行。

答案 1 :(得分:1)

简短回答:您不能:AFAIK,目前无法直接从sqlalchemy执行此操作。

但是,如果经常更改模型并将不同版本推广到生产环境,则可以使用sqlalchemy-migrate。否则,这可能是一种矫枉过正,你可能最好手动生成ALTER TABLE ...脚本。