Comparte el script, compañero😉😉😉
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?
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 sudo /etc/init.d/weewx stop
- realizar una copia de seguridad de la base de datos que está actualmente en ejecución. Nos colocamos en la ruta
/var/lib/weewx/
y desde ahí renombramos con
mv weewx.sdb weewx_old.sdb
/home/pi/
con
sudo nano /home/pi/unirbd.py
un archivo nuevo que contenga este script
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()
- desde el terminal ejecutamos el script con
sudo python /home/pi/unirbd.py
y en unos segundos debería obrar su magia. Tras la unión de ambas bases de datos movemos la resultante hasta
/var/lib/weewx/weewx.sdb
procurando poner el nombre original. En esta ruta ahora tendremos
weewx.sdb
y
weewx_old.sdb
- arrancar de nuevo WeeWX con
sudo /etc/init.d/weewx start
y esperar al siguiente ciclo de escritura en la base de datos para comprobar que todo ha ido bien
Explico un poco el contenido del scriptcomo 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.