sqlalchemy,如果它不存在,则创建一个sqlite数据库

Gan*_*alf 20 python sql sqlite sqlalchemy

我正在尝试sqlalchemy,我正在使用此连接字符串连接到我的数据库

engine = create_engine('sqlite:///C:\\sqlitedbs\\database.db')
Run Code Online (Sandbox Code Playgroud)

sqlalchemy是否为您创建一个sqlite数据库,如果它本身不存在于应该获取数据库文件的目录中?

Gan*_*alf 22

是的,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)
Run Code Online (Sandbox Code Playgroud)

  • 如果其他人感到困惑:文件是在 `create_all(engine)` 语句期间创建的,而不是在 `create_engine(...)` 语句期间创建。 (6认同)
  • 所以如果sqlite数据库是你指向的那个目录中的现有文件,它会调用它吗?即:如果存在,连接到它,否则,创建它.我说得对吗? (2认同)
  • 的确,我发现情况确实如此。 (2认同)

dan*_*nio 7

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

OperationalError: (sqlite3.OperationalError) unable to open database file
Run Code Online (Sandbox Code Playgroud)

我的解决方法是这样做,虽然感觉很讨厌:

    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)
Run Code Online (Sandbox Code Playgroud)


dsu*_*rsl 6

正如其他人发布的那样,SQLAlchemy 将自动执行此操作。然而,当我没有使用足够的斜杠时,我遇到了这个错误

我用SQLALCHEMY_DATABASE_URI="sqlite:///path/to/file.db"的时候我应该已经使用了四个斜杠:SQLALCHEMY_DATABASE_URI="sqlite:////path/to/file.db"


Art*_*nig 6

Linux 存储 SQLite3 数据库

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

engine = create_engine('sqlite:///school.db', echo=True)
Run Code Online (Sandbox Code Playgroud)

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