este es mi database.pyFrasco ¿cómo se usa sqlalchemy declarativamente con init_db()?
engine = create_engine('sqlite:///:memory:', echo=True)
session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))
Base = declarative_base()
Base.query = session.query_property()
def init_db():
# import all modules here that might define models so that
# they will be registered properly on the metadata. Otherwise
# you will have to import them first before calling init_db()
import models
Base.metadata.create_all(engine)
y este es mi backend.py
from flask import Flask, session, g, request, render_template
from database import init_db, session
from models import *
app = Flask(__name__)
app.debug = True
app.config.from_object(__name__)
# Serve static file during debug
if app.config['DEBUG']:
from werkzeug import SharedDataMiddleware
import os
app.wsgi_app = SharedDataMiddleware(app.wsgi_app, {
'/': os.path.join(os.path.dirname(__file__), 'static')
})
@app.route('/')
def foo():
session.add(User())
session.commit()
return "NOTHING HERE."
if __name__ == "__main__":
init_db()
app.run(port=8888)
estoy notando un par de cosas extrañas:
- Cuando hago
python backend.py
soy viendo las tablas creadas dos veces. Se ejecutan las mismas sentencias create table - Cuando visito '/', recibo el siguiente error incluso cuando estoy 100% seguro de que las tablas se han creado. ¿Por qué?
cursor.execute(statement, parameters) OperationalError: (OperationalError) no such table: users u'INSERT INTO users DEFAULT VALUES'()
¿Puedes publicar el código de tu modelo también? No estoy seguro de qué es exactamente lo que estás tratando de hacer aquí. En general, debe llamar a la creación de la base de datos (init_db) solo una vez. Sugiero al menos sacarlo de backend.py y simplemente llamar a database.py una vez antes. – codegeek