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

时间:2018-04-05 00:27:32

标签: python sqlite orm pylint peewee

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

每个模型在类meta中设置模型类数据库连接。

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

#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)

1 个答案:

答案 0 :(得分:1)

global在您尝试使用它的意义上不是运营商。这很奇怪,但你会改写:

global db
database = db

然而,您的代码存在问题。您尝试将字符串用于Model.Meta.database属性 - 此属性应为数据库实例

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