Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQLAlchemy create_all() does not create tables

I'm trying to integrate PostgreSQL and SQLAlchemy but SQLAlchemy.create_all() is not creating any tables from my models.

My code:

from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy  app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://login:pass@localhost/flask_app' db = SQLAlchemy(app) db.create_all() db.session.commit()  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 __init__(self, username, email):         self.username = username         self.email = email      def __repr__(self):         return '<User %r>' % self.username  admin = User('admin', '[email protected]') guest = User('guest', '[email protected]') db.session.add(admin) db.session.add(guest) db.session.commit() users = User.query.all() print users         

But I get this error: sqlalchemy.exc.ProgrammingError: (ProgrammingError) relation "user" does not exist

How can I fix this?

like image 297
Paul Avatar asked Dec 23 '13 13:12

Paul


People also ask

Does SQLAlchemy auto create table?

Creating and Inserting Data into Tables By passing the database which is not present, to the engine then sqlalchemy automatically creates a new database.

What does DB Create_all () do?

Creating and Dropping Database Tables create_all() creates foreign key constraints between tables usually inline with the table definition itself, and for this reason it also generates the tables in order of their dependency.

How do I create a database in Flask-SQLAlchemy?

Step 1 - Install the Flask-SQLAlchemy extension. Step 2 - You need to import the SQLAlchemy class from this module. Step 3 - Now create a Flask application object and set the URI for the database to use. Step 4 - then use the application object as a parameter to create an object of class SQLAlchemy.

What is difference between SQLAlchemy and Flask-SQLAlchemy?

One of which is that Flask-SQLAlchemy has its own API. This adds complexity by having its different methods for ORM queries and models separate from the SQLAlchemy API. Another disadvantage is that Flask-SQLAlchemy makes using the database outside of a Flask context difficult.


1 Answers

You should put your model class before create_all() call, like this:

from flask import Flask from flask_sqlalchemy import SQLAlchemy  app = Flask(__name__)  app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://login:pass@localhost/flask_app' 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)      def __init__(self, username, email):         self.username = username         self.email = email      def __repr__(self):         return '<User %r>' % self.username  db.create_all() db.session.commit()  admin = User('admin', '[email protected]') guest = User('guest', '[email protected]') db.session.add(admin) db.session.add(guest) db.session.commit() users = User.query.all() print users 

If your models are declared in a separate module, import them before calling create_all().

Say, the User model is in a file called models.py,

from flask import Flask from flask_sqlalchemy import SQLAlchemy  app = Flask(__name__)  app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://login:pass@localhost/flask_app' db = SQLAlchemy(app)  # See important note below from models import User  db.create_all() db.session.commit()  admin = User('admin', '[email protected]') guest = User('guest', '[email protected]') db.session.add(admin) db.session.add(guest) db.session.commit() users = User.query.all() print users 

Important note: It is important that you import your models after initializing the db object since, in your models.py _you also need to import the db object from this module.

like image 73
rocknrollnerd Avatar answered Sep 29 '22 08:09

rocknrollnerd