0

I am creating 33 variables which execute a db query and I know there must be a way to make it simpler then writing 33 lines of code manually. What I am doing right now is:

    allrtd = c.execute("SELECT Amsterdam from rtdtimes")
    allrtd1 = c.execute("SELECT Bucharest from rtdtimes")
    allrtd2 = c.execute("SELECT Barcelona from rtdtimes")
    allrtd3 = c.execute("SELECT Berlin from rtdtimes")
    allrtd4 = c.execute("SELECT Bratislava from rtdtimes")
    allrtd5 = c.execute("SELECT Budapest from rtdtimes")
    allrtd6 = c.execute("SELECT Copenhagen from rtdtimes")
    allrtd7 = c.execute("SELECT Dublin from rtdtimes")
    allrtd8 = c.execute("SELECT Dusseldorf from rtdtimes")
    allrtd9 = c.execute("SELECT Dubai from rtdtimes")
    allrtd10 = c.execute("SELECT Florence from rtdtimes")
    allrtd11 = c.execute("SELECT Frankfurt from rtdtimes")
    allrtd12 = c.execute("SELECT Geneva from rtdtimes")
    allrtd13 = c.execute("SELECT Hamburg from rtdtimes")
    allrtd14 = c.execute("SELECT HongKong from rtdtimes")
    allrtd15 = c.execute("SELECT Istanbul from rtdtimes")
    allrtd16 = c.execute("SELECT LosAngeles from rtdtimes")
    allrtd17 = c.execute("SELECT London from rtdtimes")
    allrtd18 = c.execute("SELECT Madrid from rtdtimes")
    allrtd19 = c.execute("SELECT Milan from rtdtimes")
    allrtd20 = c.execute("SELECT Marseille from rtdtimes")
    allrtd21 = c.execute("SELECT Moscow from rtdtimes")
    allrtd22 = c.execute("SELECT Munich from rtdtimes")
    allrtd23 = c.execute("SELECT NewYork from rtdtimes")
    allrtd24 = c.execute("SELECT Paris from rtdtimes")
    allrtd25 = c.execute("SELECT Prague from rtdtimes")
    allrtd26 = c.execute("SELECT Rotterdam from rtdtimes")
    allrtd27 = c.execute("SELECT Sofia from rtdtimes")
    allrtd28 = c.execute("SELECT Stockholm from rtdtimes")
    allrtd29 = c.execute("SELECT Venice from rtdtimes")
    allrtd30 = c.execute("SELECT Vienna from rtdtimes")
    allrtd31 = c.execute("SELECT Warsaw from rtdtimes")
    allrtd32 = c.execute("SELECT Zurich from rtdtimes")

I have a list with all the city names already which is done like this:

city1 = ['Amsterdam', 'Bucharest', 'Barcelona', 'Berlin', 'Bratislava', 'Budapest',
            'Copenhagen', 'Dublin', 'Dusseldorf', 'Dubai', 'Florence', 'Frankfurt',
            'Geneva', 'Hamburg', 'HongKong', 'Istanbul', 'LosAngeles', 'London',
            'Madrid', 'Milan', 'Marseille', 'Moscow', 'Munich', 'NewYork',
            'Paris', 'Prague', 'Rotterdam', 'Sofia', 'Stockholm', 'Venice', 'Vienna',
            'Warsaw', 'Zurich']

Also I am using Flask so I need to render this variable in the template so that I can use these variables in the html file.

Right now I am rendering it like this:

return render_template("Allresults.html", city1=city1, allrtd=allrtd,
                                       allrtd1=allrtd1, allrtd2=allrtd2, allrtd3=allrtd3, allrtd4=allrtd4,
                                       allrtd5=allrtd5, allrtd6=allrtd6, allrtd7=allrtd7, allrtd8=allrtd8,
                                       allrtd9=allrtd9, allrtd10=allrtd10, allrtd11=allrtd11, allrtd12=allrtd12,
                                       allrtd13=allrtd13, allrtd14=allrtd14, allrtd15=allrtd15, allrtd16=allrtd16,
                                       allrtd17=allrtd17, allrtd18=allrtd18, allrtd19=allrtd19, allrtd20=allrtd20,
                                       allrtd21=allrtd21, allrtd22=allrtd22, allrtd23=allrtd23, allrtd24=allrtd24,
                                       allrtd25=allrtd25, allrtd26=allrtd26, allrtd27=allrtd27, allrtd28=allrtd28,
                                       allrtd29=allrtd29, allrtd30=allrtd30, allrtd31=allrtd31, allrtd32=allrtd32)

I do not know how to use a dictionary to do exactly this as the duplicate question is very different to what I am doing.

Ghostali
  • 73
  • 1
  • 1
  • 11

1 Answers1

0

You may benefit from a custom jinja2 filter here:

@app.template_filter('city_data')
def city_data(city_name):
    return c.execute("SELECT {city} from rtdtimes".format(city=city_name))

@app.route('/')
def index():

    return render_template("Allresults.html", cities=city1)

Then, in your Allresults.html template use:

{% for city in cities %}

    {{ city|city_data }}

{% endfor %} 

However, be very careful because you are leaving yourself open to SQL injection attacks if you ever allow a user to specify the city.

Steve Rossiter
  • 2,624
  • 21
  • 29
  • 1
    N queries to retrieve the data isn't a good idea for performance either - better to get all the cities requested and then loop over the results. – Sean Vieira Feb 04 '16 at 20:05