SQL в Flask / Python: разные значения? - PullRequest
0 голосов
/ 04 июня 2019

У меня есть нормализованная база данных, и я создал запрос для выбора типа Покемона.

SELECT pokedata.name, poketypes.type
FROM pokedata
LEFT JOIN poketypes
ON pokedata.pokeID = poketypes.pokeID

Вывод

+-----------+--------+
|   Name    |  Type  |
+-----------+--------+
| Bulbasaur | grass  |
| Bulbasaur | poison |
| Ivysaur   | grass  |
| Ivysaur   | poison |
| Venusaur  | grass  |
| Venusaur  | poison |
+-----------+--------+

Однако в Flask или Python я не уверенкак принять этот запрос и использовать его без повторения значения имени.

Вот что у меня есть в данный момент:

pokemon.py

pokemon = conn.execute("SELECT p.name, poketypes.type FROM pokedata AS p LEFT JOIN poketypes ON p.pokeID = poketypes.pokeID")
return render_template('index.html', pokemon=pokemon)

index.html

      {% for row in pokemon %}  
       {{ row['name'] }} has types {{ row['type'] }} 
      {% endfor %}

Output
Bulbasaur has types grass 
Bulbasaur has types poison

Вот что я надеюсь вывести (я предполагаю, что мне нужен цикл, но я не уверен, как его реализовать)

Bulbasaur has types grass, poison
Ivysaur has types grass, poison

(я не был уверен, чтоназвание имеет смысл - не стесняйтесь предложить лучший заголовок!)

Ответы [ 3 ]

1 голос
/ 04 июня 2019

Использовать defaultdict

from collections import defaultdict
rows=[['Bulbasaur','grass'],
['Bulbasaur','poison '],
['Ivysaur','grass']
]
d=defaultdict(list)
for row in rows:
    d[row[0]].append(row[1])

for k,v in d.items()    :
    print(f"{k} has types {', '.join(v)} ")

Бульбазавр имеет виды травы, яда

Ивисавр имеет виды травы

0 голосов
/ 04 июня 2019

Мысли об этом подходе? Есть ли что-то «не так» с этим как таковым? (Это работает ... после долгих поисков того, почему мне нужно преобразовать объекты в списки).

Я думаю, два SQL-запроса не идеальны?

pokemonDetails = conn.execute("SELECT pokedata.pokeID, pokedata.name FROM pokedata")
pokemonDetails = list(pokemonDetails)

pokemonTypes = conn.execute("SELECT pokedata.pokeID, poketypes.type FROM pokedata LEFT JOIN poketypes ON pokedata.pokeID = poketypes.pokeID")
pokemonTypes = list(pokemonTypes)


 {% for row in pokemonDetails %}
    {{ row['name'] }}
    {% for type in pokemonTypes if row['pokeID'] == type['pokeID'] %}
        {{ type['type'] }}
    {% endfor %}
  {% endfor %}
0 голосов
/ 04 июня 2019

group_concat() ваш друг:

SELECT pokedata.name, group_concat(poketypes.type, ', ') AS types
FROM pokedata
LEFT JOIN poketypes ON pokedata.pokeID = poketypes.pokeID
GROUP BY pokedata.name
ORDER BY pokedata.name;

дает

name        types       
----------  -------------
Bulbasaur   grass, poison
Ivysaur     grass, poison
Venusaur    grass, poison
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...