我在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
是无。
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
设置为无。为什么呢?
答案 0 :(得分:45)
您必须设置默认值,否则使用None / NULL:
is_active = Column(Boolean, unique=False, default=True)
您希望在__init__
中执行此操作,但您使用的是is_active = True
(本地变量),而不是self.is_active = True
。
答案 1 :(得分:16)
is_active = Column(Boolean, server_default='t', default=True)
答案 2 :(得分:9)
如果您正在使用Flask-SQLAlchemy,则可以使用此命令创建服务器端默认值。
from sqlalchemy.sql import expression
active = db.Column(db.Boolean, server_default=expression.true(), nullable=False)
这将在数据库上创建一个默认值,这样任何人都可以写入它,而数据库将具有默认值。
答案 3 :(得分:0)
如果有人正在寻找解决方案并使用 Flask,您会这样做。
需要注意的是,服务器默认值应该在迁移文件中使用,而不是在模型本身上使用。
一旦你使用 a 生成迁移
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 的地方。