beebek
beebek

Reputation: 1947

creating tables from different models with sqlalchemy

I have different models e.g. model1.py, model2.py etc. Some how tables are being created following pocoo link, which required to be invoked from terminal.

But

    def init_db():
        import model.model1
        import model.model2
        Base.metadata.create_all(bind=engine)

This is not working, rather requires to be invoked from terminal.

>> from database import init_db
>> init_db() #works

enter image description here


database.py

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('sqlite:///xyz.sqlite', echo=True)
db_session = scoped_session(sessionmaker(autocommit=False,
                                    autoflush=False,
                                    bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()

def init_db():
   import model.admin # from model.admin import User doesnt help either
   import model.role
   Base.metadata.create_all(bind=engine)

if __name__ == '__main__':
   init_db()

admin.py

from sqlalchemy import Column, Integer, String
from database import Base

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(50), unique=True)
    email = Column(String(120), unique=True)

    def __init__(self, name=None, email=None):
        self.name = name
        self.email = email

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

There are no errors although an empty db file is generated. How can database be created from multiple models?

Upvotes: 6

Views: 16570

Answers (2)

user1012513
user1012513

Reputation: 2365

Use this code. Base.metadata.create_all(engine) It will create tables.

Upvotes: 0

skytreader
skytreader

Reputation: 11707

I'm not sure why invoking directly from command line triggers table creation for you but I've always structured my Flask apps ala Digital Ocean's guide. Something that wasn't noted explicitly in the quide is the fact that you need to initialize your blueprints first before create_all is able to build the database tables for you.

(Your code as it is, lacks blueprints. Maybe try to create some first then try again?)

Upvotes: 2

Related Questions