如何在生产和测试中使用 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
我正在开发一个 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