Autor Tema: Tema para especialistas en BBDD weewx  (Leído 1552 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jantoni

  • Moderador Global
  • Full Member
  • *****
  • Mensajes: 146
    • Ver Perfil
    • Rivas-Vaciamadrid Centro
  • Estación: ESMAD2800000028522A
Re:Tema para especialistas en BBDD weewx
« Respuesta #15 en: 12 de Enero del 2020, 00:29:11 am »
Interesante, no lo he usado nunca para unir dos bases de datos.

Saludos
Estación Meteorológica: Davis Vantage Vue (sin Weatherlink)
Software: Weewx 3.7
Servidor Meteo: Raspberry Pi Modelo B. 256 MB

Desconectado JosMar

  • Jr. Member
  • **
  • Mensajes: 75
    • Ver Perfil
  • Estación: ESCTB3900000039108A
Re:Tema para especialistas en BBDD weewx
« Respuesta #16 en: 12 de Enero del 2020, 21:02:10 pm »
Aún no me he 'atrevido' a hacer el volcado de la vieja base de datos en la nueva. Me da cierto reparo pensar que pueda ocurrir alguna inconsistencia y eche por tierra todo el proceso teniendo que volver a reinstalar y empezar de nuevo, aunque por otra parte, no tendré más remedio que armarme de valor  ::) y probar si quiero tener todos los registros en una misma base de datos. Si lo consigo dejaré por aquí los pasos y resultados.

un saludo.

Desconectado Xavi-EA5ZF

  • Full Member
  • ***
  • Mensajes: 201
  • Ham Radio Operator EA5ZF
    • Ver Perfil
    • MeteoLaVall
  • Estación: ESPVA1200000012600A
Re:Tema para especialistas en BBDD weewx
« Respuesta #17 en: 13 de Enero del 2020, 18:08:29 pm »
Creo que para unir dos bases de datos hay que hacer una cosa mas que sacar los dos dump y unirlos ya que al hacer el dump, se crea un fichero de texto con la orden de crear la tabla correspondiente y luego los insert necesarios, al concatenar los dos dump, el primero se ejecutará bien, pero al tratar el siguiente, la tabla se volvería a crear y creo que se borraría lo insertado primero, dejando solo los últimos datos.
Yo creo los dos ficheros de texto del dump, y lo que hago es insertar los datos (las lineas con los insert) al final, y con eso se inserta todo sin problemas.
No hay que temer tener datos duplicados porque la base de datos weewx tiene clave unica y es la fecha y la hora, al tratarse de la misma base de datos, si un registro ya existe no lo inserta.
Para hacerlo utilizo el Notepad++ que es un editor de texto que le da cien patadas al bloc de notas del windows.
Sobre todo insistir en una buena política automatizada y chequeada de copias, lo deseable es el conjunto completo o sea copia física del fichero de la bbdd, y luego sacar exportación y dump o volcado. Con esto nunca nos quedaremos sin algo utilizable y actualizado, que luego con el dataloger completamos para no perder ni un solo dato.
Saludos.
Xavi

Desconectado jmviper

  • Moderador Global
  • Hero Member
  • *****
  • Mensajes: 2.565
  • "Vortex Complex"
    • Ver Perfil
    • www.meteoarchena.es
  • Estación: Archena - ESMUR3000000030600B
Re:Tema para especialistas en BBDD weewx
« Respuesta #18 en: 13 de Enero del 2020, 20:27:20 pm »
Sí Xavi... sería lo mejor hacerlo así y nos desentendemos de problemas, errores y resultados inesperados.

Saludos


Archena, Valle de Ricote (Murcia). 120 msnm. 19.301 hab.
Davis Vantage Pro2 Plus

www.meteoarchena.es

Desconectado JosMar

  • Jr. Member
  • **
  • Mensajes: 75
    • Ver Perfil
  • Estación: ESCTB3900000039108A
Re:Tema para especialistas en BBDD weewx
« Respuesta #19 en: 11 de Febrero del 2020, 07:56:20 am »
Hola
retomo este hilo. Disculpad que no haya podido comentar antes mi resultado uniendo las dos bases de datos pero solamente quería decir que tras mucho trastear con SQL tuve que abandonar porque me fue totalmente imposible hacer una unión correcta (ya sabéis, que las dos bases de datos copiaran sus tablas a la perfección sin errores, etc etc etc..) finalmente conseguí mi propósito con un pequeño script en Python que realiza la operación sin problemas consiguiendo una única base de datos limpia con clave primaria sin errores (dateTime) y todos los registros de las tablas volcados consecutivamente y sin errores en aquellos que sean NULL (vacíos)
saludos.
« Última modificación: 11 de Febrero del 2020, 08:13:48 am por JosMar »

Desconectado jantoni

  • Moderador Global
  • Full Member
  • *****
  • Mensajes: 146
    • Ver Perfil
    • Rivas-Vaciamadrid Centro
  • Estación: ESMAD2800000028522A
Re:Tema para especialistas en BBDD weewx
« Respuesta #20 en: 11 de Febrero del 2020, 08:38:52 am »
Comparte el script, compañero😉😉😉
Estación Meteorológica: Davis Vantage Vue (sin Weatherlink)
Software: Weewx 3.7
Servidor Meteo: Raspberry Pi Modelo B. 256 MB

Desconectado JosMar

  • Jr. Member
  • **
  • Mensajes: 75
    • Ver Perfil
  • Estación: ESCTB3900000039108A
Re:Tema para especialistas en BBDD weewx
« Respuesta #21 en: 11 de Febrero del 2020, 22:16:38 pm »
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?  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: [Seleccionar]
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
Código: [Seleccionar]
/var/lib/weewx/ y desde ahí renombramos con
Código: [Seleccionar]
mv weewx.sdb weewx_old.sdb
  • crear en
Código: [Seleccionar]
/home/pi/ con
Código: [Seleccionar]
sudo nano /home/pi/unirbd.py un archivo nuevo que contenga este script
Código: [Seleccionar]
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
Código: [Seleccionar]
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
Código: [Seleccionar]
/var/lib/weewx/weewx.sdb procurando poner el nombre original. En esta ruta ahora tendremos
Código: [Seleccionar]
weewx.sdb y
Código: [Seleccionar]
weewx_old.sdb
  • arrancar de nuevo WeeWX con
Código: [Seleccionar]
sudo /etc/init.d/weewx start 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.
« Última modificación: 15 de Febrero del 2020, 18:13:21 pm por JosMar »

Desconectado jantoni

  • Moderador Global
  • Full Member
  • *****
  • Mensajes: 146
    • Ver Perfil
    • Rivas-Vaciamadrid Centro
  • Estación: ESMAD2800000028522A
Re:Tema para especialistas en BBDD weewx
« Respuesta #22 en: 12 de Febrero del 2020, 00:15:07 am »
Muchas gracias.

Por supuesto, el que quiera usarlo, bajo su responsabilidad y haciendo siempre copias de seguridad
Estación Meteorológica: Davis Vantage Vue (sin Weatherlink)
Software: Weewx 3.7
Servidor Meteo: Raspberry Pi Modelo B. 256 MB