user1012451
user1012451

Reputation: 3433

SQLAlchemy boolean value is None

I have this table in my Pyramid app

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

When I did my test, it said is_active is 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)

From my integration log I see when we are creating the row, is_active is set to None. Why?

Upvotes: 60

Views: 118448

Answers (5)

Mike Reiche
Mike Reiche

Reputation: 460

Provided solutions here don't work for me (SQLAchemy 1.4.40)

def test_entity():
    class Entity(Base):
        __tablename__ = "test_entities"
        id = Column(BigInteger, primary_key=True)
        is_active = Column(Boolean, nullable=False, default=True)

    entity = Entity()
    assert entity.is_active is True
Expected :True
Actual   :None

Upvotes: 0

Ojas Kale
Ojas Kale

Reputation: 2159

If someone is looking for a solution and using Flask this is how you'd do it.

It is very important to note that server default should be used inside the migrations file, not on the model itself.

once you generate migrations using a

flask db migrate

you should see new migration in the folder ( 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'))

This is the place where you'd want to add server_default.

Upvotes: 2

Sowmitra Nalla
Sowmitra Nalla

Reputation: 683

If you're using Flask-SQLAlchemy, you can use this command to create a server side default.

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

This will create a default value on the database so anyone can write to it and the DB will have the default value.

Upvotes: 68

far
far

Reputation: 2757

is_active = Column(Boolean, server_default='t', default=True)

Upvotes: 30

Jochen Ritzel
Jochen Ritzel

Reputation: 107598

You have to set a default value otherwise None/NULL is used:

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

You wanted to do this in __init__ but you used is_active = True (a local variable) instead of self.is_active = True.

Upvotes: 79

Related Questions