47

我的 Pyramid 应用程序中有这张表

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    .....
    is_active = Column(Boolean, unique=False)
    def __init__(self, name, raw_password):
        is_active = True

当我做我的测试时,它说is_active是None。

def test_register_user(self):
    user = User('user1', '1234')
    self.sess.add(user)
    self.sess.flush()

    #print user
    #self.assertTrue(user.is_active, True)
    user_db_record = self.sess.query(User).filter_by(name=user.name).first()
    self.assertEqual(user_db_record.is_active, True)

从我的集成日志中,我看到我们在创建行时is_active设置为无。为什么?

4

4 回答 4

65

您必须设置默认值,否则使用 None/NULL:

is_active = Column(Boolean, unique=False, default=True)

您想在其中执行此操作,__init__但您使用is_active = True(局部变量)而不是self.is_active = True.

于 2012-08-20T22:06:50.073 回答
45

如果您使用的是 Flask-SQLAlchemy,则可以使用此命令创建服务器端默认值。

from sqlalchemy.sql import expression
active = db.Column(db.Boolean, server_default=expression.true(), nullable=False)

这将在数​​据库上创建一个默认值,以便任何人都可以写入它,并且数据库将具有默认值。

于 2017-06-27T18:09:50.933 回答
22
is_active = Column(Boolean, server_default='t', default=True)
于 2016-01-04T16:28:48.830 回答
0

如果有人正在寻找解决方案并使用 Flask,这就是您的做法。

需要注意的是,服务器默认值应该在迁移文件中使用,而不是在模型本身上使用,这一点非常重要。

一旦您使用

flask db migrate

您应该在文件夹中看到新的迁移( migrations/versions/XXXXXX.py )

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.add_column('users', sa.Column('confirmed', sa.Boolean(), nullable=True, server_default='f'))
    op.add_column('users', sa.Column('confirmed_on', sa.DateTime(), nullable=True))
    op.add_column('users', sa.Column('is_admin', sa.Boolean(), nullable=True, server_default='f'))

这是您要添加 server_default 的地方。

于 2021-03-18T20:15:40.397 回答