Flask-SQLAlchemy SQLITE布尔字段始终返回False

时间:2015-11-28 00:30:27

标签: 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)

我的架构定义如下:

create TABLE users (
    id INTEGER not null,
    can_view_records BOOLEAN not null,
    PRIMARY KEY (id)
);

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

+----+------------------+
| id | can_view_records |
+----+------------------+
| 8  | 1                |
| 9  | 0                |
+----+------------------+

在Python中查询它们总是为False字段提供can_view_records

>>> User.query.get(8).can_view_records
False
>>> User.query.get(9).can_view_records
False

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

>>> User.query.filter_by(can_view_records=True).all()
[<id 8>]

但即使该结果也返回False:

>>> User.query.filter_by(can_view_records=True).first().can_view_records
False

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

使用Python 2.7.10SQLAlchemy==1.0.9Flask-SQLAlchemy==2.1Flask==0.10.1无法在OSX上重现

#!/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

生成db:

>>>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()

sqlite表看起来像这样:

sqlite> select * from user;
1|admin|admin@example.com|1
2|guest|guest@example.com|0

所有查询看起来都没问题:

>>>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