Flask-SQLAlchemy SQLITE 布尔字段总是返回 False

tdc*_*tdc 4 python sqlite sqlalchemy flask-sqlalchemy

我在 SQLAlchemy 中使用 sqlite。我有一个类(修剪)定义如下:

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    can_view_records = db.Column(db.Boolean, default=False, nullable=False)
Run Code Online (Sandbox Code Playgroud)

我的模式定义如下:

create TABLE users (
    id INTEGER not null,
    can_view_records BOOLEAN not null,
    PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)

在我的数据库中,我有以下几行:

+----+------------------+
| id | can_view_records |
+----+------------------+
| 8  | 1                |
| 9  | 0                |
+----+------------------+
Run Code Online (Sandbox Code Playgroud)

在 Python 中查询它们总是让我False了解该can_view_records领域。

>>> User.query.get(8).can_view_records
False
>>> User.query.get(9).can_view_records
False
Run Code Online (Sandbox Code Playgroud)

但是对该字段执行过滤器会成功:

>>> User.query.filter_by(can_view_records=True).all()
[<id 8>]
Run Code Online (Sandbox Code Playgroud)

但即使该结果也返回 False:

>>> User.query.filter_by(can_view_records=True).first().can_view_records
False
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

Sin*_*nux 7

使用相同的代码无法在 OSX 上使用Python 2.7.10,SQLAlchemy==1.0.9Flask-SQLAlchemy==2.1,重现Flask==0.10.1

#!/usr/bin/env python
# encoding: utf-8

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)
    can_view_records = db.Column(db.Boolean, default=False, nullable=False)

    def __init__(self, username, email, can_view_records):
        self.username = username
        self.email = email
        self.can_view_records = can_view_records

    def __repr__(self):
        return '<User %r>' % self.username
Run Code Online (Sandbox Code Playgroud)

生成数据库:

>>>from app import db, User
>>>db.create_all()
>>>admin = User('admin', 'admin@example.com', True)
>>>guest = User('guest', 'guest@example.com', False)
>>>db.session.add(admin)
>>>db.session.add(guest)
>>>db.session.commit()
Run Code Online (Sandbox Code Playgroud)

sqlite 表看起来像这样:

sqlite> select * from user;
1|admin|admin@example.com|1
2|guest|guest@example.com|0
Run Code Online (Sandbox Code Playgroud)

所有查询看起来都不错:

>>>User.query.get(1).can_view_records
>>>True
>>>User.query.get(2).can_view_records
>>>False
>>>User.query.filter_by(can_view_records=True).first().can_view_records
>>>True
Run Code Online (Sandbox Code Playgroud)