Pregunta: ¿Es posible usar una variable como nombre de la tabla sin tener que usar constructores de cadenas para hacerlo?Nombre de la tabla de variables en sqlite
Info:
Estoy trabajando en un proyecto en este momento que los catálogos de datos de una simulación estrella de la mía. Para hacerlo, estoy cargando todos los datos en una base de datos sqlite. Está funcionando bastante bien, pero he decidido agregar mucha más flexibilidad, eficiencia y facilidad de uso a mi db. Planeo luego agregar planetoides a la simulación, y quería tener una tabla para cada estrella. De esta forma no tendría que consultar una tabla de 20m de algunos planetoides para el 1-4k en cada sistema solar.
Me han dicho que el uso de constructores de cadenas es malo porque me deja vulnerable a un ataque de inyección SQL. Si bien eso no es un gran problema aquí ya que soy la única persona con acceso a estos db, me gustaría seguir las mejores prácticas. Y también de esta manera, si hago un proyecto con una situación similar en la que esté abierto al público, sé qué hacer.
Actualmente estoy haciendo esto:
cursor.execute("CREATE TABLE StarFrame"+self.name+" (etc etc)")
Esto funciona, pero me gustaría hacer algo más como:
cursor.execute("CREATE TABLE StarFrame(?) (etc etc)",self.name)
aunque entiendo que esto probablemente sería imposible. aunque me conformaría con algo así como
cursor.execute("CREATE TABLE (?) (etc etc)",self.name)
Si esto no es posible, voy a aceptar esa respuesta, pero si alguien conoce una manera de hacer esto, digo. :)
Estoy codificando en python.
Así que no es posible. Eso es lo que necesitaba saber. Y su método de limpieza propuesto se ve muy bien. ¡Gracias! – Narcolapser
Personalmente, lanzaría una excepción si se ven esos personajes en su lugar. No deben estar allí, entonces algo está mal y preferiría saberlo. –
-1; los detalles de esta respuesta parecen defectuosos. Es demasiado restrictivo (no permite, por ejemplo, subrayar los nombres de las tablas, que son bastante comunes) y, como @JanHudec ha señalado, si 'scrub()' alguna vez elimina algún carácter, es casi seguro que habrá roto la consulta ; eso debería provocar que se lanzara una excepción inmediatamente en lugar de esperar a que se produzca el tiempo de ejecución de la consulta. –