У меня есть проект, мне нужен конфигурационный файл YAML, используемый для проверки соединения с базой данных, и у меня есть некоторые проблемы: если host-Speci c отсутствует, он будет автоматически использоваться по умолчанию (localhost). Я протестировал его с примером файла
ниже, но кажется, что мой код имеет проблему, хост не отображает значение по умолчанию как loacalhost, когда он пуст, иначе он не отображает ни одного. Кто-нибудь может предложить мне? Где я не прав?
Мой пример файла data_source.yml:
database:
dbopt:
host:
port: 5432
dbname: db1
user: username
password: 1234
client_encoding: utf-8
connect_timeout: 60
sslmode: none
query:
select * from manufacturing_product
query:
select * from manufacturing_product
Мой код:
import yaml
class InvalidConfigError(Exception):
pass
class DB:
def __init__(self, dbconf):
self._dbconf = dict(dbconf)
# checking for database type
dbtype = self.get_db_type()
if dbtype != 'sqlite' and dbtype != 'postgres':
raise InvalidConfigError(
'E01001', 'Invalid database type, should be sqlite or postgres.')
else:
self.dbtype = dbtype
#checking db option
dbopt = self.__get_dbopt()
if dbopt is None:
raise InvalidConfigError(
'E01002', 'Invalid database options.')
else:
self.dbopt = dbopt
#checking host
host = dbopt.get('host')
if host is None or len(host) <= 0:
self.host = 'localhost'
else:
self.host = host
#checking dbname
dbname = dbopt.get('dbname')
if dbname is None or len(dbname) <= 0:
raise Exception("Database name is required.")
else:
self.dbname = dbname
def get_db_type(self):
return self._dbconf['db']
def __get_dbopt(self):
return self._dbconf.get('dbopt')
def get_db_host(self):
return self.host
def get_db_name(self):
return self.dbname
with open('data_source.yml') as file:
data = yaml.full_load(file)
for item, doc in data.items():
print(item, ":", doc)
db = DB(data)
Вывод:
database:
dbopt:
host:
port: 5432
dbname: db1
user: username
password: 1234
client_encoding: utf-8
connect_timeout: 60
sslmode: none
query:
select * from manufacturing_product