49

I am trying out SQLAlchemy and I am using this connection string:

engine = create_engine('sqlite:///C:\\sqlitedbs\\database.db')

Does SQLAlchemy create an SQLite database if one is not already present in a directory it was supposed to fetch the database file?

5 Answers 5

50

Yes,sqlalchemy does create a database for you.I confirmed it on windows using this code.
Be aware DB creation is lazy - it is created at the latest possible time. In this example this is when the metadata is created (and thus tries to create the tables).

from sqlalchemy import create_engine, ForeignKey
from sqlalchemy import Column, Date, Integer, String
from sqlalchemy.ext.declarative import declarative_base
 
engine = create_engine('sqlite:///C:\\sqlitedbs\\school.db', echo=True)
Base = declarative_base()
 

class School(Base):
    
    __tablename__ = "woot"
 
    id = Column(Integer, primary_key=True)
    name = Column(String)  
 
    
    def __init__(self, name):
        
        self.name = name    

# this ultimately creates the database (if it does not exist)
Base.metadata.create_all(engine)
Sign up to request clarification or add additional context in comments.

3 Comments

so if the sqlite database is an existing file in that directory that you are pointing at, it will call it up instead? Ie: if it exist, connect to it, else, create it. Am I right to say that?
Absolutely,i found that to be the case.
In case others are confused: the file is created during the create_all(engine) statement, not during the create_engine(...) statement.
21

As others have posted, SQLAlchemy will do this automatically. I encountered this error, however, when I didn't use enough slashes!

I used SQLALCHEMY_DATABASE_URI="sqlite:///path/to/file.db" when I should have used four slashes: SQLALCHEMY_DATABASE_URI="sqlite:////path/to/file.db"

Comments

13

Linux stored SQLite3 database

database will be create in the same folder as the .py file:

engine = create_engine('sqlite:///school.db', echo=True)

will instantiate the school.db file in the same folder as the .py file.

1 Comment

I need to call engine.connect() to get the db file actually created
8

I found (using sqlite+pysqlite) that if the directory exists, it will create it, but if the directory does not exist it throws an exception:

OperationalError: (sqlite3.OperationalError) unable to open database file

My workaround is to do this, although it feels nasty:

    if connection_string.startswith('sqlite'):
        db_file = re.sub("sqlite.*:///", "", connection_string)
        os.makedirs(os.path.dirname(db_file), exist_ok=True)
    self.engine = sqlalchemy.create_engine(connection_string)

4 Comments

Right, in this case I would probably just print a message to the user that says, "Sorry, I can't create database FOO because directory BAR does not exist." Then, if the user wants to create it and proceed, they can.
For an interactive app that's fine, but I also want this to work in a continuous integration context
Once the directories exist, it will work in continuous integration. You have to decide whether the missing directory is an error and requires user intervention (in which case you generate a error message and give up) or whether a missing directory is just a warning or minor exception in which case you create (possibly a whole chain of) directories and carry on, which, as you say, is 'nasty'. Or you make it configurable...
by "make it configurable", I mean provide a config setting where the user can say 'create any missing directories without bothering me about it' or 'let me know if directories are missing and I'll create them for you.'
4

@Gandolf's answer was good.

The database is created it when you make any connection with your engine.

Here's an example of doing nothing with a database besides connecting to it, and this will create the database.

from sqlalchemy import create_engine

engine = create_engine('sqlite:///database.db')

with engine.connect() as conn:
    pass

Without the engine.connect() or some form of metadata.create_all() the database will not be created.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.