如何禁用peewee的自动连接?
How to disable peewee's automatic connections?
考虑以下代码
import peewee
SQL_CONN = peewee.MySQLDatabase(database=SQL_DATA,
host=SQL_HOST,
port=SQL_PORT,
user=SQL_USER,
passwd=SQL_PASS)
class User(peewee.Model):
name = peewee.CharField(max_length=100, primary_key=True)
born = peewee.DateTimeField()
print(SQL_CONN.is_closed()) # True
print(User.select().where(User.name == "Jack").execute()) # Silently opens a connection w/o letting me know
print(SQL_CONN.is_closed()) # False
这将在后台自动执行 SQL_CONN.connect()
。
如何禁用此功能 - 强制 peewee
在数据库未连接时抛出异常 - 而不是在不通知我的情况下自动连接到它。
首先,你的例子是假的,是错误的。当您仅创建查询对象时,Peewee 不会打开连接。看看:
In [1]: from peewee import *
In [2]: db = SqliteDatabase(':memory:')
In [3]: class User(Model):
...: username = TextField()
...: class Meta:
...: database = db
...:
In [4]: db.is_closed() # Should be True.
Out[4]: True
In [5]: query = User.select().where(User.username == 'charlie')
In [6]: db.is_closed() # Still TRUE, we haven't evaluated anything yet!
Out[6]: True
所以,首先,你的例子甚至都不正确。您必须评估查询才能执行。
回答这个问题的其余部分:
Peewee 不提供禁止隐式连接的机制。如果您尝试执行查询,Peewee 将打开不存在的连接。
我建议您在执行查询时应该非常清楚,因此在您需要打开连接时。如果这还不够,那么子类化并覆盖 Database.cursor()
方法。
编辑:
尽管之前没有人提出过这个要求,但实现起来非常简单,我已将此功能添加到 Peewee。将包含在下一个版本中。
考虑以下代码
import peewee
SQL_CONN = peewee.MySQLDatabase(database=SQL_DATA,
host=SQL_HOST,
port=SQL_PORT,
user=SQL_USER,
passwd=SQL_PASS)
class User(peewee.Model):
name = peewee.CharField(max_length=100, primary_key=True)
born = peewee.DateTimeField()
print(SQL_CONN.is_closed()) # True
print(User.select().where(User.name == "Jack").execute()) # Silently opens a connection w/o letting me know
print(SQL_CONN.is_closed()) # False
这将在后台自动执行 SQL_CONN.connect()
。
如何禁用此功能 - 强制 peewee
在数据库未连接时抛出异常 - 而不是在不通知我的情况下自动连接到它。
首先,你的例子是假的,是错误的。当您仅创建查询对象时,Peewee 不会打开连接。看看:
In [1]: from peewee import *
In [2]: db = SqliteDatabase(':memory:')
In [3]: class User(Model):
...: username = TextField()
...: class Meta:
...: database = db
...:
In [4]: db.is_closed() # Should be True.
Out[4]: True
In [5]: query = User.select().where(User.username == 'charlie')
In [6]: db.is_closed() # Still TRUE, we haven't evaluated anything yet!
Out[6]: True
所以,首先,你的例子甚至都不正确。您必须评估查询才能执行。
回答这个问题的其余部分:
Peewee 不提供禁止隐式连接的机制。如果您尝试执行查询,Peewee 将打开不存在的连接。
我建议您在执行查询时应该非常清楚,因此在您需要打开连接时。如果这还不够,那么子类化并覆盖 Database.cursor()
方法。
编辑:
尽管之前没有人提出过这个要求,但实现起来非常简单,我已将此功能添加到 Peewee。将包含在下一个版本中。