Преобразование таблицы в JSON - PullRequest
0 голосов
/ 03 мая 2020

Я создаю приложение для викторины в Python 3. Пользователям показывают кучу подсказок, и они должны угадать звезду спорта. Мой текущий бэкэнд использует SQLite, однако я хочу иметь живую базу данных, использующую Firebase, и поэтому мне нужно изменить ее на JSON формат.

Таблица в настоящее время выглядит следующим образом:

Player Name  Difficulty     Year      Club     Apps (Goals)
player_1     easy       2014 - 2017   club        x (y)
player_1     easy       2017 - 2019   club_2      x (y)
player_2     medium     2019 -        club        x (y)

В настоящее время пользователи выбирают сложность. Затем я запускаю запрос SQL, который дает мне список всех игроков с этой сложностью. Затем приложение отображает пользователю последние три столбца, которые являются ключами, которые они должны использовать, чтобы угадать игрока.

Чтобы вставить в JSON формат, я думал, что это будет выглядеть примерно так

{
    "users":
    {
        "player_1_id":
        {
            "name": "player_1",
            "difficulty": "difficulty",
            "year": [year_1, year_2, ..., year_n],
            "club": [club_in_year_1, club_in_year_2, ...., club_in_year_n],
            "apps": [apps_in_year_1, apps_in_year_2, ..., apps_in_year_n]
        },
        "player_2_id":
            "name": "player_2",
            ...
    }
}

Таким образом, в каждом списке года / клуба / приложений может быть разное количество значений для каждого имени игрока. Я создал и запустил следующий код:

import sqlite3

def dict_factory(cursor, row):
    d = {}
    for idx, col in enumerate(cursor.description):
        d[col[0]] = row[idx]
    return d

connection = sqlite3.connect("player_database.db")
connection.row_factory = dict_factory

cursor = connection.cursor()

cursor.execute("select * from player_history")

results = cursor.fetchall()

print(results)

connection.close()

, но при этом каждая новая строка печатается с отдельным идентификатором, что не совсем то, что я хочу.

Как мне отредактировать это, чтобы получить мой желаемый выход?

1 Ответ

0 голосов
/ 03 мая 2020

Вот базовое c решение для отображения ваших данных.

# define a function that takes a data array as argument
def mapData(data = []):
  # dict that is used to store aggregated rows
  results = {}
  # iterate through the data array
  for item in data:
    # aggreagate values of there is already an entry
    # in the results dict for given name
    if item["name"] in results.keys():
      prev = results[item["name"]]
      prev["year"].append(item["year"])
      prev["club"].append(item["club"])
      prev["apps"].append(item["apps"])
      # continue will skip to next iteration
      continue 
    # create a new entry if there is no existing key
    # for given name in the results dict
    results[item["name"]] = {
      **item,
      "year": [item["year"]],
      "club": [item["club"]],
      "apps": [item["apps"]],
    }
  # return the result
  return results

# some fake data that looks like the data from sql
sqlData= [
  {
    "name": "player_1",
    "difficulty": "difficulty",
    "year":  "2009",
    "club": "2003",
    "apps": "2005",
  },
    {
    "name": "player_1",
    "difficulty": "difficulty",
    "year":  "1999",
    "club": "1998",
    "apps": "2008",
  },
      {
    "name": "player_2",
    "difficulty": "difficulty",
    "year":  "1999",
    "club": "1998",
    "apps": "2008",
  }
]

# pass the data into the function and assign the result
# to a new variable called aggregatedData 
aggregatedData = mapData(sqlData)

# print the result
print(aggregatedData)

# result:      
# {
#    "player_1":{
#       "name":"player_1",
#       "difficulty":"difficulty",
#       "year":[
#          "2009",
#          "1999"
#       ],
#       "club":[
#          "2003",
#          "1998"
#       ],
#       "apps":[
#          "2005",
#          "2008"
#       ]
#    },
#    "player_2":{
#       "name":"player_2",
#       "difficulty":"difficulty",
#       "year":[
#          "1999"
#       ],
#       "club":[
#          "1998"
#       ],
#       "apps":[
#          "2008"
#      ]
#    }
# }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...