2014-09-19 2 views
1

Я пытаюсь сгенерировать некоторые приборы, чтобы протестировать приложение Flask, используя превосходный библиотечный микшер. Я уже использовал его в проекте Django и отлично работал, но на колбе + sqlalchemy, независимо от того, что я делаю, я получаю нулевые значения.Получение нулевых значений из микширования python

from mixer.backend.flask import mixer 
from models import Users 
from myproj import app 

mixer.init_app(app) 

me.blend(Users) 

Это возвращает null.

Я также попытался создать экземпляр непосредственно приложения.

from mixer.backend.flask import Mixer 
from models import Users 
from myproj import app 

mixer = Mixer(app=app) 

me = mixer.blend(Users) 

Возвращает ту же нулевую ценность.

Оба случая возвращают автогенерированный идентификатор. И сохраняется в базе данных, но все поля имеют Null на нем.

Любая идея о том, почему?

Благодаря

+0

Вы следовали инструкциям [Flask-SQLAlchemy] (https://github.com/klen/mixer#flask-flask-sqlalchemy)? – dirn

+0

Да. Первая попытка - это точно инструкции в документации. Во-вторых, я пытаюсь выяснить причины. Я что-то пропустил? – cllamach

+0

Существует раздел, посвященный Flask-SQLAlchemy и аргументам '__init__' (https://github.com/klen/mixer#user-content-support-for-flask-sqlalchemy-models-that-have-__init__- аргументы). Использует ли '' '' метод '__init__' для назначения значений? – dirn

ответ

4

Оказывается, это просто answer-- смеситель не генерирует данные для полей, которые могут быть нулевым. Поэтому либо указать, что в моделях, например, это работает:

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 
from mixer.backend.flask import mixer 

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://' 

db = SQLAlchemy(app) 
mixer.init_app(app) 

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

    def __repr__(self): 
     return '<User %r>' % self.username 

if __name__ == '__main__': 
    with app.app_context(): 
     db.create_all() 
     user = mixer.blend(User) 
     print user.id, user.username 

     # Prints: 1 collins1995 

Или скажите Mixer, какие поля вы хотите, чтобы произвести, если вы хотите, чтобы держать их обнуляемым:

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 
from mixer import fakers as f 
from mixer.backend.flask import mixer 

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://' 

db = SQLAlchemy(app) 
mixer.init_app(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) 

    def __repr__(self): 
     return '<User %r>' % self.username 

if __name__ == '__main__': 
    with app.app_context(): 
     db.create_all() 
     user = mixer.blend(User, username=f.get_username(), email=f.get_email()) 
     print user.id, user.username, user.email 

     # Prints: 1 lover_boots [email protected] 

Благодаря Клён, то автор Mixer для providing the solution.

+0

Awesome, я на самом деле не поставил nullable = False в любом поле. Это объясняет, как в Django это работает из коробки, поведение по умолчанию - nullable = False. – cllamach

+1

Спасибо @doobeh, но есть немного больше о втором случае: Нет необходимости использовать миксеры для значений нулевой силы, у Mixer есть волшебный атрибут 'mixer.R', который выполняет работу:' user = mixer .blend (Пользователь, имя пользователя = mixer.R, email = mixer.R) ' – klen

Смежные вопросы