Search code examples
pythonflaskpeeweeflask-peewee

Peewee error on model.create() [ Proxy ]


Hello. When i'm trying to create new record in model, i'm getting

AttributeError: 'dict' object has no attribute 'compiler'

Possible, that i'm getting this error because using Proxy class, but can't find mistake in my code.

init.py

from flask import Flask
from flask_peewee.db import Proxy
from flask_bootstrap import Bootstrap

from app.config import config_select

db = Proxy()
bootstrap = Bootstrap()

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config_select[config_name])
    config_select[config_name].init_app(app)

    db.initialize(config_select[config_name].DATABASE)
    bootstrap.init_app(app)

    #register blueprints
    from app.blueprint.main import main_bp as main_blueprint

    app.register_blueprint(main_blueprint)


    return app

models.py

from peewee import *

from app import db



class BaseModel(Model):
    class Meta:
        database = db

class User(BaseModel):
    id = PrimaryKeyField()
    username = CharField(default='test', max_length=20)

    class Meta:
        db_table = 'users'





MODELS_LIST = [User]

Database was created by manager 'generate_db_tables' command

import os
from app import create_app


from flask_script import Manager, Shell

app = create_app(os.getenv('FLASK_CONFIG') or 'default')
manager = Manager(app)



def connect_db():
    from peewee import SqliteDatabase
    db_lite = SqliteDatabase(app.config['DATABASE']['name'])
    return db_lite

@manager.command
def generate_db_tables():
    from app.models.models import MODELS_LIST
    db_lite = connect_db()
    for model in MODELS_LIST:
        db_lite.create_table(model, safe=True)
    print("Db tables created")

and the view function:

from flask import render_template, session, \
    redirect, url_for, current_app, flash, request, make_response

from . import main_bp
from .forms import NameForm
from app.models.models import User

@main_bp.route('/', methods=['GET', 'POST'])
def index():
    form = NameForm()
    if form.validate_on_submit():
        User.create(username=form.name.data) # <<<< Here is error
        return url_for('.index')
    return render_template('index.html', form=form)

Before i started to use Proxy class everything worked like a charm.


Solution

  • Seems, that i pass dict

    DATABASE = {
        'name': 'test.db',
        'engine': 'peewee.SqliteDatabase'
    }
    

    to db.initialize()

    instead of string name of database

    DATABASE_INFO = 'test.db'
    DATABASE = peewee.SqliteDatabase(DATABASE_INFO)
    db.initialize(DATABASE)