Python sqlalchemy,创建sqlite数据库(如果没有';不存在
我正在尝试sqlalchemy,并使用此连接字符串连接到我的数据库Python sqlalchemy,创建sqlite数据库(如果没有';不存在,python,sql,sqlite,sqlalchemy,Python,Sql,Sqlite,Sqlalchemy,我正在尝试sqlalchemy,并使用此连接字符串连接到我的数据库 engine = create_engine('sqlite:///C:\\sqlitedbs\\database.db') 如果目录中还没有sqlite数据库,sqlalchemy是否为您创建sqlite数据库?它应该获取数据库文件?是的,sqlalchemy确实为您创建了一个数据库。我在windows上使用此代码确认了这一点 from sqlalchemy import create_engine, ForeignKey
engine = create_engine('sqlite:///C:\\sqlitedbs\\database.db')
如果目录中还没有sqlite数据库,sqlalchemy是否为您创建sqlite数据库?它应该获取数据库文件?是的,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)
我发现(使用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)
正如其他人所发布的,SQLAlchemy将自动完成这项工作。然而,当我
我使用了
SQLALCHEMY\u数据库\u URI=”sqlite:///path/to/file.db“
当我应该使用四个斜杠时:SQLALCHEMY\u DATABASE\u URI=”sqlite:////path/to/file.db“
Linux存储的SQLite3数据库
将在与.py文件相同的文件夹中创建数据库:
engine = create_engine('sqlite:///school.db', echo=True)
将在与.py文件相同的文件夹中实例化school.db文件。因此,如果sqlite数据库是您指向的目录中的现有文件,它将调用它?Ie:如果存在,连接到它,否则创建它。我说的对吗?当然,我发现是这样的。如果其他人感到困惑:文件是在
create\u all(engine)
语句中创建的,而不是在create\u engine(…)
语句中创建的。对,在这种情况下,我可能只会向用户打印一条消息,说,“很抱歉,我无法创建数据库FOO,因为目录栏不存在。“然后,如果用户想要创建并继续,他们可以。对于交互式应用程序,这很好,但我也希望它在持续集成上下文中工作。一旦目录存在,它将在持续集成中工作。”。您必须确定丢失的目录是否是一个错误并需要用户干预(在这种情况下,您会生成一条错误消息并放弃),或者丢失的目录是否只是一个警告或小异常,在这种情况下,您会创建(可能是整条)目录并继续执行,正如您所说的,这是“令人讨厌的”。或者你让它可配置…通过“使其可配置”,我的意思是提供一个配置设置,用户可以说“创建任何丢失的目录而不打扰我”或“如果目录丢失,请告诉我,我会为您创建它们。”这是我的问题!