0

考虑以下代码

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如果数据库未连接,则强制抛出异常 - 而不是在不通知我的情况下自动连接到它。

4

1 回答 1

1

首先,你的例子是假的和错误的。当您仅创建查询对象时,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。将包含在下一个版本中。

于 2019-06-23T20:28:59.550 回答