Software > WeeWX

Tema para especialistas en BBDD weewx

<< < (5/9) > >>

jantoni:
Comparte el script, compañero😉😉😉

Chema:

--- Cita de: jantoni en 11 de Febrero de 2020, 08:38:52 ---Comparte el script, compañero😉😉😉

--- Fin de la cita ---
Hola jantoni,
por supuesto aquí tenéis el script. A mi me ha  funcionado a la primera sin problemas, pero no me hago responsable si otro lo intenta y le estropea la base de datos eh?  8)
Las bases de datos que han sido  unidas tras el uso de este script pertenecen a la versión de WeeWX 3.9.2Pasos que he seguido
* parar WeeWX con
--- Código: ---sudo /etc/init.d/weewx stop
--- Fin del código ---

* realizar una copia de seguridad de la base de datos que está actualmente en ejecución. Nos colocamos en la ruta
--- Código: ---/var/lib/weewx/
--- Fin del código ---
y desde ahí renombramos con
--- Código: ---mv weewx.sdb weewx_old.sdb
--- Fin del código ---

* crear en
--- Código: ---/home/pi/
--- Fin del código ---
con
--- Código: ---sudo nano /home/pi/unirbd.py
--- Fin del código ---
un archivo nuevo que contenga este script

--- Código: ---import sqlite3
def number_columns(table_name):
    db_2020 = sqlite3.connect('/home/pi/weewx2020.sdb')
    db_2020.row_factory = sqlite3.Row
    db_cursor = db_2020.cursor()
    db_cursor.execute("SELECT * FROM " + str(table_name))
    row_1 = db_cursor.fetchone()
    db_cursor.close()
    return row_1.keys() 

db_2019 = sqlite3.connect('/home/pi/weewx2019.sdb')
db_2020 = sqlite3.connect('/home/pi/weewx2020.sdb')

b_cursor = db_2020.cursor()
b_cursor.execute('SELECT name FROM sqlite_master WHERE type ="table" ')
output = b_cursor.fetchall()

a_cursor = db_2019.cursor()

for row in output:
    print("Table name: " + str(row[0]))
    columnNames = number_columns(str(row[0]))
    ques = []
    ques = ["?"] * len(columnNames)  # Generate list [?, ?, ?, ?,........till length equals length of columnNames[1:]
    ques = ",".join(ques)  # Generate string "?,?,?,?,?........"
    columnNames = ",".join(columnNames)  # Generate string "col1, col2, col3............"
    b_cursor.execute('SELECT * FROM ' + str(row[0]))
    rows = b_cursor.fetchall()
    for item in rows:
        #print(item)
        #print(columnNames)
        #print(ques)
        #print('INSERT or IGNORE INTO {0}({1}) VALUES ({2})'.format(str(row[0]), columnNames, ques))
        a_cursor.execute('INSERT or IGNORE INTO {0}({1}) VALUES ({2})'.format(str(row[0]), columnNames, ques), item)

db_2019.commit()
a_cursor.close()
b_cursor.close()

--- Fin del código ---
   
* desde el terminal ejecutamos el script con
--- Código: ---sudo python /home/pi/unirbd.py
--- Fin del código ---
y  en unos segundos debería obrar su magia. Tras la unión de ambas bases de datos movemos la  resultante hasta
--- Código: ---/var/lib/weewx/weewx.sdb
--- Fin del código ---
procurando poner el nombre original. En esta ruta ahora tendremos
--- Código: ---weewx.sdb
--- Fin del código ---
y
--- Código: ---weewx_old.sdb
--- Fin del código ---

* arrancar de nuevo WeeWX con
--- Código: ---sudo /etc/init.d/weewx start
--- Fin del código ---
y esperar al siguiente ciclo de escritura en la base de datos para comprobar que todo ha ido bienExplico un poco el contenido del script
como veis de lo que se trata es de unir dos bases de datos, una de 2019 y otra de 2020 (en mi caso la de 2019 iba desde el 17 de junio al 31 de diciembre y la de 2020 iba desde el 1 de enero hasta la fecha en la que hago la unión de ambas) por lo que debo conseguir una base de datos que recoja el periodo desde el 17 de junio de 2019 a la fecha actual, ordenando todos los registros por la clave primaria que en este caso es dateTimePara este escript he renombrado ambas bases de datos. La de 2019 la he llamado weewx2019.sdb y la de 2020 weewx2020.sdb para que esté más claro. Ambas bases de datos las he colocado en misma ruta donde he creado el script.

El script comienza llamando a sqlite3  por lo que debereis comprobar que lo tenéis instalado previo a su ejecución. Si no está instalado simplemente con sudo apt-get install sqlite3 solucionamos este paso. Tras la instalación un sudo apt-get update && sudo apt-get upgrade no vendría mal. Tras la importación de sqlite3, y si esta es exitosa, identifica las columnas (entidades) de las tablas que intervienen en el proceso. Una vez identificadas las entidades establece las conexiones entre ambas bases de datos. En este paso identificará las tablas que corresponden a cada base de datos.

Con toda esta información lo siguiente es definir la base de datos en la que se hará el volcado; en mi caso quiero que se haga en la de 2019 por lo que apunto a ella con a_cursor = db_2019.cursor () Tras este punto comienza el proceso.

jantoni:
Muchas gracias.

Por supuesto, el que quiera usarlo, bajo su responsabilidad y haciendo siempre copias de seguridad

pachu:
Buenas
Retomando un poco el tema de las BBDD y viendo que la mía empieza a "engordar" después de 6 años...me preguntaba si es posible o conveniente empezar una nueva por ejemplo anualmente.
Dejar los archivos NOAA generados hasta la fecha y si al empezar y una nueva BBDD estos se mantendrían en weewx y no generarían inconsistencias en meteoclimatic. ???

Saludos

jantoni:
No sé muy bien cual es tu objetivo, pero vamos a ello.

Los archivos NOAA los puedes dejar, sin en la base de datos no hay valores para esas fechas, no creo que Weewx los "mate", por si acaso, antes copia de seguridad.

Pero casi seguro que en el menú de selección de visualización, no van a aparecer los informes NOAA que no tenga controlados Weewx.

Para visualizarlos, tendrías que modificar el skin. En Seasons lo tendrías que hacer en:

/etc/weewx/skins/Seasons/titlebar.inc

Incorporando de alguna manera los NOAA antiguos.

En cuanto a inconsistencias no tengo clara la pregunta:

- Si es por los informes NOAA, estos no afectan para nada. Son simples archivos de texto generados a partir de la base de datos.

- Si es por la generación de bases de datos anuales. La respuesta es: bien hecho no.

Las inconsistencias se generan mensualmente y anualmente.

Si lo hiciera yo haría lo siguiente:

- En enero de cada año pararía weewx
- haría una copia de seguridad de la base de datos
- Calcularía el epoch time del primer segundo del nuevo año.
- Eliminaría los registros con epochtime inferior al calculado, en todas las tablas de la base de datos.
- Reiniciaría Weewx.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa