text: Q:
  
  pymysql ProgrammingError (syntax) al llamar una función de python con una cadena que representa el nombre de la tabla
  
  Estoy intentando llamar una función que ejecute una consulta de una base de datos y segun el input del usuario busque en la tabla country o en la tabla city a través del  parámetro popType de la función cityLw(). Entonces al llamar a esta función se le pasa el valor city o country.
  def cityLw(popType, popQue):
      query = 'SELECT * FROM %s WHERE population < %s'
  
      with conn:
          cursor = conn.cursor()
          if popType == 'city':
              cursor.execute(query, (popType, int(popQue)))
          else:
              cursor.execute(query, (popType, int(popQue)))
          return cursor.fetchall()
  
  popType las he definido en la funcion main, que es la que llama a cityLw() así:
  city = 'city'
  cities = WorldConn.cityLw(city, popQue)
  
  luego otra funcion llamará a cityLw() para que busque en la tabla country:
  country = 'country'
  countries = WorldConn.cityLw(country, popQue)
  
  y tengo este error:
  pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''city' WHERE population < 145' at line 1")
  
  Entonces parece que a la consulta le llega el string city con las comillas y por eso SQL lo rechaza. He probado varias cosas pero no funciona
  
  A:
  
  El problema es exactamente el que comentas, la query queda como:
  
  'SELECT * FROM 'city' WHERE population < 145'
  
  cuando debería ser:
  
  'SELECT * FROM city WHERE population < 145'
  
  Esto pasa porque en las especificaciones de DB-API 2 no se  permite la parametrización del nombre la tabla. 
  En tal caso, debes recurrir a formatear la cadena. Si te preocupa la inyección de código siempre puedes validar el nombre de la tabla. Si tienes solo dos tablas de nombre conocido, lo más simple es usar el bloque condicional:
  def cityLw(popType, popQue):
      with conn:
          cursor = conn.cursor()
          if popType == 'city':
              query = 'SELECT * FROM city WHERE population < %s'
              cursor.execute(query, (int(popQue, )))
          elif popType == 'country':
              query = 'SELECT * FROM country WHERE population < %s'
              cursor.execute(query, (int(popQue, )))
          else:
              raise ValueError("Invalid table name")
  
          return cursor.fetchall()
  
  Si tienes muchas tablas, puedes usar una "lista blanca" de nombres
  TABLES = {"city", "country"}
  
  def cityLw(popType, popQue):
      if popType not in TABLES:
          raise ValueError("Invalid table name")
  
      query = f'SELECT * FROM {popType} WHERE population < %s'
      cursor.execute(query, (int(popQue, )))
  
  En última instancia puedes realizar un filtro más genérico, por ejemplo permitiendo solo nombres válidos para una tabla según las especificaciones SQL:
  import re
  
  TABLE_NAME_VAL = re.compile(r'^[0-9a-zA-Z_\$]+$')
  
  def cityLw(popType, popQue):
      if not TABLE_NAME_VAL.match(popType):
          raise ValueError("Invalid table name")
  
      query = f'SELECT * FROM {poptype} WHERE population < %s'
  
      cursor.execute(query, (int(popQue)))
  
  