Использование psycopg2 для получения значения в таблице с Key Value - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь использовать psycopg2 для чтения Postgres.

Я читаю из таблицы базы данных, которая называется развертывание, и пытаюсь обработать значение из таблицы с тремя полями: id, Key и Value.

Один из ключей - LIST_CONFIG, и он имеет значение в следующем виде:

    list_config: {     
             "configone":{
                "disk_size":100,"machine_type":"large","region":"us-west-1"},
             "configtwo":{
                "projectname":"project","zone":"us-east1-b"}
             }

Я пытаюсь получить регион для list_config.configone.region (то есть us-west-1)

Я получаю выше list_config, запустив следующий код:

    import psycopg2
    conn = psycopg2.connect(host="localhost",database=database, user=user, password=password)
    cur = conn.cursor()
    cur.execute("SELECT \"Value\" FROM deployment WHERE (\"Key\" = 'LIST_CONFIG')")
    row = cur.fetchone()
    print(row[0])

Я не могу получить list_config.configone.region даже после выполнения следующих действий:

    row = cur.fetchone()
    config = row[0]
    print('config: %s', config["configone"])

Я получил ошибку Arguments: (TypeError('string indices must be integers',),)

Я также попробовал следующее

    row = cur.fetchone()
    config=row[0]
    args=namedtuple('row',config.keys()).*config.values())
    print('args: %s', args)

Это дало ошибку Arguments: (AttributeError("'str' object has no attribute 'keys'",),)

Есть ли способ использовать cursor_factory= DictCursor, который будет возвращать dict вместо Tuple?

++ Редактирование с помощью решения - Следующее - это то, что сработало для меня в конце ++

В конце концов я обнаружил, что строка - это кортеж и строка[0] это строка.Поэтому я использовал json.loads в строке [0], чтобы преобразовать его в объект json.Тогда я смог напечатать регион

    row = cur.fetchone()
    config_json = json.loads(row[0])
    region = config_json['configone']['region']
    print('Region: %s', region)
...