如何在生产和测试中使用 Peewee 动态设置 SQLite 数据库文件路径?

How to dynamically set SQLite database file path using Peewee in production and testing?

我正在开发一个 Python 应用程序 运行 在本地使用 Peewee 作为 ORM 的 SQLite 数据库。我对连接到指定 SQLite 数据库的开发进行了自动化测试(test.py),在生产中我希望能够动态设置生产数据库的路径——我需要动态连接到多个数据库。我计划 运行ning 应用程序从 main.py 用于生产,从 test.py 用于测试。

每个模型在 class 元中设置模型 class 数据库连接。

在 运行 时,无论是在测试中还是在生产中,有没有办法设置 db 变量的值,以便只要有实例就可以使用它正确连接到数据库每个模型 class 实例化?

#main.py

from models import (
    ExampleModel,
    db,
    )


def main():

    #request user input on database filepath

    db.init(raw_input('Enter path to database'))

    exampleObj = ExampleModel.select().where(ExampleModel.id == 1).get()


if __name__ == '__main__':
    main()


#models.py

from peewee import *

db = SqliteDatabase(None)


class ExampleModel(Model):

    field1 = IntegerField(null=True)
    field2 = TextField(null=True)
    updateDate = DateTimeField(default=datetime.datetime.now)

    class Meta:
        database = db
        db_table = 'ExampleModel'


#test.py

import unittest
from models import (
    ExampleModel,
    db,
    )


class testSetUp(unittest.TestCase):

    def test_ExampleModelConnection(self):

        db.init(r'C:\path\to\file')

        exampleObj = ExampleModel.select().where(ExampleModel.id == 1).get()

        self.assertEqual(exampleObj.id, 1)

global 不是您尝试使用它的意义上的运算符。这很奇怪,但你会这样写:

global db
database = db

但是,您的代码存在问题。您正试图为 Model.Meta.database 属性使用一个字符串——这个属性应该是一个数据库 instance:

db = SqliteDatabase('some-file.db')

class MyModel(Model):
    class Meta:
        database = db

要延迟初始化,您可以这样做:

db = SqliteDatabase(None)

class MyModel(Model):
    class Meta:
        database = db

# later...
if IS_TESTING:
    db.init('testing.db')
else:
    db.init('production.db')

文档:http://docs.peewee-orm.com/en/latest/peewee/database.html#run-time-database-configuration