Как проверить соединение с базой данных через файл конфигурации YAML в Python? - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть проект, мне нужен конфигурационный файл 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

1 Ответ

2 голосов
/ 11 февраля 2020

с вашим кодом все в порядке, просто вы не получаете его правильно, я проверил и получил значение хоста как 'localhost'

with open('data_source.yml') as file:
data = yaml.full_load(file)

for item, doc in data.items():
    print(item, ":", doc)

db = DB(data)

print("default host value:", db.get_db_host()) # added to test default host value 

Вывод:

    db : postgres
dbopt : {'host': 'None', 'port': 1234, 'dbname': 'xyz', 'user': 'abc', 'password': 'pass', 'client_encoding': 'utf-8', 'connect_timeout': 100, 'sslmode': 'none'}
insopt : {'table': 'tries', 'out': 'qubna', 'bl': 'tghqua'}
...