我希望创建26个独立的sql数据库,每个数据库具有相同的结构。 (即字母表中每个字母一个),理想情况下我可以从字典或类似字母中访问[即使用a
]访问与database["a"]
字母对应的数据库。
我目前有以下代码,它使用peewee生成一个sql数据库(在本例中为字母a)。
from peewee import *
database_location_a = "C:\\database\\a.db"
data_sql_a= SqliteDatabase(database_location_a, threadlocals=True, pragmas=(("synchronous", "off"),))
class BaseModel(Model):
class Meta:
database = data_sql_a
class main_table(BaseModel):
file_name = CharField(primary_key = True)
year = CharField()
data_sql_a.connect()
data_sql_a.create_tables([main_table])
这部分代码我可以轻松地循环(例如,我可以轻松创建文件位置字典)。但是,我被困住的地方是,如果位置被编码到类Basemodel
中,我该如何循环呢[即我需要26个单独的类,如果是这样,我可以创建它而无需复制/粘贴类26次]?同样,鉴于main_table
使用BaseModel
,我是否还需要该类的26个单独实例?
我可能会以错误的方式解决这个问题,但是想知道我可以采取什么方法来调整此代码以创建多个文件,而无需多次复制/粘贴它?
答案 0 :(得分:2)
我能够使用peewee database proxy object获得正在运行的解决方案。
from peewee import *
database_proxy = Proxy()
class BaseModel(Model):
class Meta:
database = database_proxy # Use proxy for our DB.
class main_table(BaseModel):
file_name = CharField(primary_key = True)
year = CharField()
import string
db_names = string.ascii_lowercase
# print(db_names) # abcdefghijklmnopqrstuvwxyz
'''
Loop over all the characters in the string and create databases in the current folder of this script
'''
for db_name in db_names:
database = SqliteDatabase('{}.db'.format(db_name), threadlocals=True, pragmas=(("synchronous", "off"),))
database_proxy.initialize(database)
database_proxy.connect()
database_proxy.create_tables([main_table])
根据Proxy documentation,您可以像调用database_proxy
后的database
对象一样使用database_proxy.initialize(database)
变量。例如,connect()
和create_tables()
实际上是通过database
在database_proxy
上调用的。