使用 Peewee 创建相同结构的多个 sql 数据库
Creating multiple sql databases of the same structure using Peewee
我希望创建 26 个独立的 sql 数据库,每个数据库都具有相同的结构。 (即字母表中的每个字母一个),理想情况下我可以从字典或类似的[即使用 database["a"]
] 访问对应于字母 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])
此代码的某些部分我可以轻松循环(例如,我可以轻松创建文件位置字典)。然而,我被卡住的地方是给定位置被编码到 class Basemodel
,我如何遍历那个 [即我是否需要 26 个单独的 classes,如果需要,我可以创建它而不需要 copy/paste class 26 次]?同样,如果 main_table
使用 BaseModel
,我是否还需要 class 的 26 个单独实例?
我可能会以错误的方式解决这个问题,但想知道我可以采用什么方法来调整此代码以创建多个文件,而不需要多次 copy/paste 它?
我能够使用 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.initialize(database)
后像通常对 database
对象一样使用那个 database_proxy
变量。例如,connect()
和 create_tables()
实际上是在 database
到 database_proxy
上被调用的。
我希望创建 26 个独立的 sql 数据库,每个数据库都具有相同的结构。 (即字母表中的每个字母一个),理想情况下我可以从字典或类似的[即使用 database["a"]
] 访问对应于字母 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])
此代码的某些部分我可以轻松循环(例如,我可以轻松创建文件位置字典)。然而,我被卡住的地方是给定位置被编码到 class Basemodel
,我如何遍历那个 [即我是否需要 26 个单独的 classes,如果需要,我可以创建它而不需要 copy/paste class 26 次]?同样,如果 main_table
使用 BaseModel
,我是否还需要 class 的 26 个单独实例?
我可能会以错误的方式解决这个问题,但想知道我可以采用什么方法来调整此代码以创建多个文件,而不需要多次 copy/paste 它?
我能够使用 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.initialize(database)
后像通常对 database
对象一样使用那个 database_proxy
变量。例如,connect()
和 create_tables()
实际上是在 database
到 database_proxy
上被调用的。