我正在尝试使用SQLAlchemy,我正在使用这个连接字符串:
engine = create_engine('sqlite:///C:\\sqlitedbs\\database.db')
SQLAlchemy会在指定的目录中获取数据库文件时,如果该目录中不存在SQLite数据库文件,是否会自动创建一个?
我正在尝试使用SQLAlchemy,我正在使用这个连接字符串:
engine = create_engine('sqlite:///C:\\sqlitedbs\\database.db')
是的,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)
正如其他人所说,SQLAlchemy会自动完成这个任务。然而,当我没有使用足够多的斜线时,我遇到了这个错误。
我使用的是SQLALCHEMY_DATABASE_URI="sqlite:///path/to/file.db"
,但我应该使用四个斜线:SQLALCHEMY_DATABASE_URI="sqlite:////path/to/file.db"
Linux存储SQLite3数据库
数据库将在与.py文件相同的文件夹中创建:
engine = create_engine('sqlite:///school.db', echo=True)
将在与 .py 文件相同的文件夹中实例化 school.db 文件。
我发现(使用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)
@Gandolf的回答很好。
当您与引擎建立任何连接时,数据库会被创建。
这是一个除了连接到数据库之外什么都不做的示例,这将创建数据库。
from sqlalchemy import create_engine
engine = create_engine('sqlite:///database.db')
with engine.connect() as conn:
pass
engine.connect()
或者metadata.create_all()
的话,数据库将不会被创建。
create_all(engine)
语句期间创建的,而不是在create_engine(...)
语句期间创建的。 - dthor