SQLAlchemy布尔值为None

use*_*451 28 python sqlalchemy pyramid

我在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
Run Code Online (Sandbox Code Playgroud)

当我做我的测试时,它说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)
Run Code Online (Sandbox Code Playgroud)

从我的集成日志中,我看到在创建行时,is_active将其设置为None.为什么?

Joc*_*zel 46

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

is_active = Column(Boolean, unique=False, default=True)
Run Code Online (Sandbox Code Playgroud)

你想这样做,__init__但你使用is_active = True(一个局部变量)而不是self.is_active = True.

  • `server_default`对于布尔值应该是什么值? (7认同)
  • @Hussain [Postgres docs](https://www.postgresql.org/docs/current/static/datatype-boolean.html)陈述真/假值的有效文字列表和`'t'` /`'f ''就是其中之一.我选择`server_default ='t'`它对我有用. (3认同)

小智 17

is_active = Column(Boolean, server_default='t', default=True)
Run Code Online (Sandbox Code Playgroud)

  • 请为您的答案添加一些解释! (7认同)
  • @ρss Alembic 似乎不会单独从 `default` 迁移代码中生成 SQL 级别的默认值子句,您必须明确提供 `server_default`。至于‘t’值,请看[我上面的评论](http://stackoverflow.com/questions/12045698/sqlalchemy-boolean-value-is-none#comment69750602_12045897)。 (4认同)

小智 15

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

from sqlalchemy.sql import expression
active = db.Column(db.Boolean, server_default=expression.true(), nullable=False)
Run Code Online (Sandbox Code Playgroud)

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

  • Flask 有何关系?因为这似乎是常规的 SQLAlchemy 事物,我认为您可能将“db.TYPE”内容与 SQLAlchemy“Column”的“server_default”参数混淆了? (3认同)