javascript - HTML/JS como interfaz para base de datos SQLite local
Estoy escribiendo una aplicación de base de datos bastante simple, que quiero que se almacene localmente (en lugar de consultar una base de datos remota). Me gusta HTML/Javascript para diseñar interfaces, y son multiplataforma (¡todos tienen un navegador!), así que realmente me gustaría escribir una página web como interfaz. No debería haber interacción cliente/servidor: solo quiero que los usuarios puedan interactuar con la base de datos usando un navegador, en lugar de un programa nativo.
Sin embargo, la única forma que veo de acceder a bases de datos desde un navegador es usando algo como WebSQL o IndexedDB. Ambos, sin embargo, abstraen el proceso de gestionar el archivo de la base de datos en sí, y lo almacenan en algún lugar de la configuración del usuario. Quiero distribuir el archivo de la base de datos junto con la aplicación.
En resumen: ¿hay una manera de usar HTML/JavaScript para modificar un archivo de base de datos SQLite local? ¿O HTML no es la herramienta que debería estar usando para este tipo de aplicación?
EDITAR: posiblemente relevante
Respuesta #1
Esto es lo que he terminado haciendo:
Como se menciona aquí, puedes usar Python para crear un servidor web local. Este tutorial proporciona una infraestructura básica para el manejador del servidor. Tuve que lidiar con algunos problemas, posiblemente causados por Python 3 o por usar Chrome para acceder a mi página local.
Mi función manejadora de GET terminó viéndose así:
def do_GET(self):
try:
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
try:
fn = GETHANDLERS[self.path[1:]]
self.wfile.write(fn().encode("utf-8"))
except KeyError:
self.wfile.write(self.path.encode("utf-8"))
return
except:
self.send_error(404, 'File Not Found: {0}'.format(self.path))
Donde GETHANDLERS es un diccionario que asigna URLs a funciones; por ejemplo, si visitas http://localhost/my_func, se llama a la función GETHANDLERS['my_func']. Si no existe ninguna función para la URL, la URL simplemente se devuelve tal cual.
He implementado funciones que manipulan una base de datos SQLite local con el módulo sqlite3. Aquí hay un ejemplo de la consulta para listar todo en la tabla Categories:
import sqlite3
def get_categories():
con = sqlite3.connect('my.db')
c = con.cursor()
c.execute('''SELECT * FROM Categories;''')
return [cat[0] for cat in c.fetchall()]
GETHANDLERS["categories"] = get_categories
Para usar la aplicación local, es necesario que el usuario instale Python, luego ejecute el script del servidor antes de abrir la página web. ¡Creo que esto es bastante aceptable!
Respuesta #2
Si realmente quieres solo una aplicación del lado del cliente, deberías considerar usar tecnologías HTML5 (WebSQL, Indexed DB). Una buena lectura está aquí: html5 doctor. Necesitarás exportar la base de datos a algún lugar, o permitir que el usuario exporte la base de datos y, cuando el usuario recargue la página, la base de datos debería reconectarse. Ejemplo: exportar websql a un archivo csv.
