Passare da MySQL a SQLite

Introduzione

Questo articolo tratta il passaggio di un database da MySQL a SQLite. Per informazioni sul passaggio nella direzione opposta, vedere l'articolo di accompagnamento, Passaggio da SQLite a MySQL.

Ci sono due approcci generali:

  1. Utilizzare mysqldump per creare un file dump, trasformarlo, quindi ripristinarlo utilizzando l'utilità sqlite3;
  2. Usare l'utilità wee_database.

Il primo è più generale e può essere fatto indipendentemente da Weewx. Il secondo è più semplice, ma richiede l'accesso al resto di Weewx.

Utilizzo dei comandi mysqldump e sqlite3

Per il primo approccio, scarica prima il database MySQL utilizzando mysqldump:

$ mysqldump -u root -p --skip-add-drop-table --skip-add-locks --extended-insert=FALSE weewx archive > weewx.sql

Sfortunatamente, il file risultante include un'istruzione CREATE TABLE che SQLite non comprende. Potrei scrivere uno script sed di fantasia qui per trasformarlo in qualcosa che sqlite3 può gestire, ma il più semplice è semplicemente modificare il file weewx.sql, sostituendo l'istruzione CREATE TABLE con:

CREATE TABLE archive (`dateTime` INTEGER NOT NULL UNIQUE PRIMARY KEY, 
`usUnits` INTEGER NOT NULL, `interval` INTEGER NOT NULL, 
`barometer` REAL, `pressure` REAL, `altimeter` REAL, `inTemp` REAL,
`outTemp` REAL, `inHumidity` REAL, `outHumidity` REAL, `windSpeed` REAL,
`windDir` REAL, `windGust` REAL, `windGustDir` REAL, `rainRate` REAL,
`rain` REAL, `dewpoint` REAL, `windchill` REAL, `heatindex` REAL, 
`ET` REAL, `radiation` REAL, `UV` REAL, `extraTemp1` REAL, 
`extraTemp2` REAL, `extraTemp3` REAL, `soilTemp1` REAL, 
`soilTemp2` REAL, `soilTemp3` REAL, `soilTemp4` REAL, 
`leafTemp1` REAL, `leafTemp2` REAL, `extraHumid1` REAL, 
`extraHumid2` REAL, `soilMoist1` REAL, `soilMoist2` REAL, 
`soilMoist3` REAL, `soilMoist4` REAL, `leafWet1` REAL, `leafWet2` REAL, 
`rxCheckPercent` REAL, `txBatteryStatus` REAL, 
`consBatteryVoltage` REAL, `hail` REAL, `hailRate` REAL, 
`heatingTemp` REAL, `heatingVoltage` REAL, `supplyVoltage` REAL, 
`referenceVoltage` REAL, `windBatteryStatus` REAL, 
`rainBatteryStatus` REAL, `outTempBatteryStatus` REAL, 
`inTempBatteryStatus` REAL);

Quindi ripristinare utilizzando sqlite3 (che potrebbe essere necessario installare prima)

$ sqlite3 weewx.sdb < weewx.sql 

Inserisci il file sqlite3 risultante, weewx.sdb, ovunque lo richieda il tuo metodo di installazione.

Se il nuovo database deve essere usato come archivio Weewx allora Weewx deve essere configurato per usare SQLite per l'archivio. Questo può essere fatto modificando le impostazioni del data binding a cui [StdArchive] data_binding fa riferimento. Per modificare le impostazioni dell'associazione dati a cui fa riferimento [StdArchive] data_binding, modificare weewx.conf e se l'associazione dati a cui [StdArchive] data_binding fa riferimento è wx_binding, modificare le impostazioni [DataBindings] wx_binding come segue:

[DataBindings]

    [[wx_binding]]
        database = archive_sqlite
        table_name = archive
        manager = weewx.wxmanager.WXDaySummaryManager
        schema = schemas.wview.schema

Nota che le impostazioni di cui sopra si basano sulla presenza di una voce archive_sqlite nella sezione [Databases] di weewx.conf e sull'uso dello schema standard del database Weewx. Se questo non è il caso (ad esempio si utilizza uno schema modificato) sarà necessario modificare una o più delle impostazioni di cui sopra di conseguenza.

Usando wee_database

Per trasferire un database utilizzando wee_database, i data binding per i database di origine e di destinazione devono esistere in weewx.conf. Poiché il database di origine sarà molto probabilmente il database di archivio attualmente utilizzato da Weewx, è probabile che solo il database di destinazione richieda l'aggiunta di un data binding a weewx.conf. Per aggiungere un'associazione dati: modificare weewx.conf, individuare la sezione [DataBinding] e aggiungere un'associazione simile alla seguente:

    [[dest_binding]]
        database = archive_sqlite
        table_name = archive
        manager = weewx.wxmanager.WXDaySummaryManager
        schema = schemas.wview.schema

Le impostazioni precedenti presuppongono una voce archive_sqlite nella sezione [Databases] di weewx.conf e che si utilizzi lo schema wview del database predefinito. Se questo non è il caso (ad esempio, si utilizza uno schema modificato) sarà necessario modificare una o più delle impostazioni di cui sopra di conseguenza.

Prima di effettuare il trasferimento, potrebbe essere utile eseguire wee_database con l'opzione --help:

$ wee_database --help

Nota l'opzione --dry-run. Se utilizzato con l'opzione --transfer, wee_database stampa ciò che accadrebbe ma non esegue effettivamente il trasferimento.

Per utilizzare l'opzione --dry-run con --transfer:

$ wee_database --transfer --dest-binding=dest_binding --dry-run

Ciò si tradurrà in un output simile a questo:

Using configuration file /home/weewx/weewx.conf
Using database binding 'wx_binding', which is bound to database 'archive_mysql'
Transfer 7814 records from source database 'weewx' to destination database 'weewx.sdb'.
Dry run, nothing done.

Se il test ha avuto successo, il trasferimento può essere completato utilizzando il seguente comando:

$ wee_database --transfer --dest-binding=dest_binding

Ciò si tradurrà in un output simile a questo:

Using configuration file /home/weewx/weewx.conf
Using database binding 'wx_binding', which is bound to database 'archive_mysql'
Transfer 7814 records from source database 'weewx' to destination database 'weewx.sdb' (y/n)? y
transferring, this may take a while.... complete
7814 records transferred from source database 'weewx' to destination database 'weewx.sdb'.

Una volta completato il trasferimento e prima che il nuovo database possa essere utilizzato con Weewx, è necessario creare i riepiloghi giornalieri all'interno del nuovo database. Se Weewx è configurato per utilizzare il nuovo database, i riepiloghi giornalieri verranno creati automaticamente da Weewx al successivo avvio. In alternativa, i riepiloghi giornalieri possono essere costruiti manualmente utilizzando l'utility wee_database e l'opzione --rebuild-daily:

$ wee_database --rebuild-daily --binding=dest_binding

L'ultimo passo è configurare Weewx per usare il database SQLite. In weewx.conf, modifica il wx_binding in modo che corrisponda a dest_binding:

    [DataBindings]
        [[wx_binding]]
            database = archive_sqlite
            table_name = archive
            manager = weewx.wxmanager.WXDaySummaryManager
            schema = schemas.wview.schema

Assicurati di interrompere e quindi avviare Weewx dopo ogni modifica a weewx.conf.

Avvertenze

Weewx v3.0.0 o superiore è necessario per trasferire il database da MySQL a SQLite. Quando Weewx viene installato utilizzando setup.py e la posizione predefinita di wee_database è /home/weewx, viene installata in /home/weewx/bin/wee_database. Quando Weewx viene installato utilizzando .deb o .rpm, wee_database viene installato in /usr/share/weewx/wee_database con un collegamento simbolico in /usr/bin/wee_database.

Autore: Tom Keffer