我在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
我错过了什么吗?
答案 0 :(得分:1)
Python 2.7.10
,SQLAlchemy==1.0.9
和Flask-SQLAlchemy==2.1
,Flask==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