我正在开发一个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)
答案 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