在SQLAlchemy中检查SQLite连接错误

4

我正在使用SQLAlchemy连接到本地SQLite数据库。

这是我使用的代码-

db = sqlalchemy.create_engine('sqlite:///Latencydb.db')
metadata = sqlalchemy.MetaData(db)

即使文件不存在,也不会引发任何异常。即使是db.connect()也不会抛出任何异常。

有没有一种方法可以检查数据库连接是否成功?(除了检查数据库中特定表的存在性之外?)

我正在使用Python 2.7.2(Ubuntu)上的sqlite 3.7.7和sqlalchemy 0.6.8。


1
你有考虑过如果不存在,它是否会创建 SQLite 数据库文件吗?这可能部分地解释了缺少异常的原因。 - JosefAssad
是的,这正是我想的。我正在寻找一个开关或参数来实现“仅打开”模式,但我找不到。 - vineet
1个回答

10

在Python 3.4以下的版本(包括Python 2.7),当连接到一个尚不存在的SQLite数据库文件时,无法防止SQLite为您创建该文件。

因此,在旧版Python中,您将需要使用其他方式首先测试文件是否存在。简单地使用os.path.exists即可:

import os.path

database = '/path/to/database.db'
if not os.path.exists(database):
    raise ValueError('Invalid database path: %s' % (database,)
db = sqlalchemy.create_engine('sqlite:///' + database)
在更新的Python版本中,sqlite3库支持SQLite URI语法,因此您可以在sqlite3.connect()调用上设置uri=True,并指定mode=rw参数以禁用默认的rwc(读写创建)模式。
SQLAlchemy目前不支持SQLite URI参数,但您可以利用creator参数来传递URI标志和您自己的连接字符串。
import sqlite3

uri = 'file:/path/to/database.db?mode=rw'

creator = lambda: sqlite3.connect(uri, uri=True)

db = sqlalchemy.create_engine('sqlite:////', creator=creator)

好的,这只是一个原型代码.. 最终我需要使用MySQL数据库.. 但是如果SQLite是唯一可行的方式,那么我想它也可以。 - vineet
如果您的参数是SQLAlchemy数据库URL或SQLite内存数据库怎么办?似乎不应该解析参数以检查文件是否存在...我正在寻找一些SQLAlchemy选项,以便在文件不存在时_不创建_该文件。 - jjmontes
1
@jjmontes:我已经更新了答案,展示了如何使用SQLite3的?mode=rw参数来实现这个。 - Martijn Pieters
这太棒了。对于我的用例来说,如果SQLAlchemy利用这一点并引入一些明确的方法来避免为适合此情况的DB驱动程序创建文件,那将是很好的(在我的用例中,它可以是任何数据库系统,所以我仍然需要先检查驱动程序是否为sqlite)。同时,非常高兴得到大师的回答:向您致敬并感谢! - jjmontes

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