如果数据库不存在,则创建SQLite数据库。

47

我正在尝试使用SQLAlchemy,我正在使用这个连接字符串:

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

SQLAlchemy会在指定的目录中获取数据库文件时,如果该目录中不存在SQLite数据库文件,是否会自动创建一个?
5个回答

47

是的,sqlalchemy会为你创建数据库。我在Windows上使用以下代码确认了这一点

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    


Base.metadata.create_all(engine)

2
所以如果在你所指向的目录中,SQLite数据库是一个已存在的文件,它会直接调用它,对吗?也就是说:如果它存在,则连接到它;否则创建新的。我的理解对吗? - jake wong
3
完全正确,我发现事情就是这样。 - Gandalf
12
如果其他人感到困惑:文件是在create_all(engine)语句期间创建的,而不是在create_engine(...)语句期间创建的。 - dthor

16

正如其他人所说,SQLAlchemy会自动完成这个任务。然而,当我没有使用足够多的斜线时,我遇到了这个错误。

我使用的是SQLALCHEMY_DATABASE_URI="sqlite:///path/to/file.db",但我应该使用四个斜线:SQLALCHEMY_DATABASE_URI="sqlite:////path/to/file.db"


2
这就是我的问题! - Eric Frechette

11

Linux存储SQLite3数据库

数据库将在与.py文件相同的文件夹中创建:

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

将在与 .py 文件相同的文件夹中实例化 school.db 文件。


1
我需要调用 engine.connect() 方法来实际创建数据库文件。 - Alan

8

我发现(使用sqlite+pysqlite),如果目录存在,它会创建该目录,但是如果目录不存在,则会抛出异常:

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

我的解决方法是这样的,尽管感觉有点恶心:

    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)

在这种情况下,我可能会向用户打印一条消息,内容为“抱歉,无法创建数据库FOO,因为目录BAR不存在。”然后,如果用户想要创建它并继续进行,他们可以这样做。 - Tom Barron
对于一个交互式应用程序来说,这很好,但我也希望在持续集成环境中能够正常工作。 - danio
1
一旦目录存在,它将在持续集成中工作。您必须决定缺少的目录是否是错误并需要用户干预(在这种情况下,您会生成错误消息并放弃),还是缺少目录只是警告或轻微异常,在这种情况下,您创建(可能是整个链)目录并继续进行,正如您所说的那样,“令人讨厌”。或者您可以使其可配置... - Tom Barron
“使其可配置”指提供一个配置设置,用户可以选择“在不打扰我的情况下创建任何缺失的目录”或“告诉我缺少哪些目录,我会为您创建它们”。 - Tom Barron

4

@Gandolf的回答很好。

当您与引擎建立任何连接时,数据库会被创建。

这是一个除了连接到数据库之外什么都不做的示例,这将创建数据库。

from sqlalchemy import create_engine

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

with engine.connect() as conn:
    pass

没有使用engine.connect()或者metadata.create_all()的话,数据库将不会被创建。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接