Comment renommer une colonne dans une table de firebase database SQLite?

Je devrais renommer quelques colonnes dans certaines tables d’une firebase database SQLite. Je sais qu’une question similaire a déjà été posée sur stackoverflow, mais c’était pour SQL en général, et le cas de SQLite n’était pas mentionné.

À partir de la documentation SQLite pour ALTER TABLE , je suppose que ce n’est pas possible “facilement” (c’est-à-dire une seule instruction ALTER TABLE).

Je me demandais si quelqu’un connaissait une méthode SQL générique pour SQLite.

    Disons que vous avez une table et devez renommer “colb” en “col_b”:

    D’abord, vous renommez l’ancienne table:

    ALTER TABLE orig_table_name RENAME TO tmp_table_name; 

    Ensuite, créez la nouvelle table, basée sur l’ancienne table, mais avec le nom de la colonne mis à jour:

     CREATE TABLE orig_table_name ( col_a INT , col_b INT ); 

    Ensuite, copiez le contenu en face de la table d’origine.

     INSERT INTO orig_table_name(col_a, col_b) SELECT col_a, colb FROM tmp_table_name; 

    Enfin, déposez l’ancienne table.

     DROP TABLE tmp_table_name; 

    Envelopper tout cela dans une BEGIN TRANSACTION; et COMMIT; est aussi probablement une bonne idée.

    S’il est vrai qu’il n’y a pas ALTER COLUMN, si vous souhaitez uniquement renommer la colonne, supprimer la contrainte NOT NULL ou modifier le type de données, vous pouvez utiliser le jeu de commandes suivant:

    Remarque: ces commandes risquent de corrompre votre firebase database. Assurez-vous donc d’avoir une sauvegarde.

     PRAGMA writable_schema = 1; UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS'; PRAGMA writable_schema = 0; 

    Vous devrez fermer et rouvrir votre connexion ou passer au vide la firebase database pour recharger les modifications dans le schéma.

    Par exemple:

     Y:\> sqlite3 booktest SQLite version 3.7.4 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> create table BOOKS ( title TEXT NOT NULL, publication_date TEXT NOT NULL); sqlite> insert into BOOKS VALUES ("NULLTEST",null); Error: BOOKS.publication_date may not be NULL sqlite> PRAGMA writable_schema = 1; sqlite> UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS'; sqlite> PRAGMA writable_schema = 0; sqlite> .q Y:\> sqlite3 booktest SQLite version 3.7.4 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> insert into BOOKS VALUES ("NULLTEST",null); sqlite> .q 

    Références:


    pragma writable_schema
    Lorsque ce pragma est activé, les tables SQLITE_MASTER dans lesquelles la firebase database peut être modifiée à l’aide d’instructions UPDATE, INSERT et DELETE ordinaires. Attention: une mauvaise utilisation de ce pragma peut facilement entraîner un fichier de firebase database corrompu.

    modifier la table
    SQLite prend en charge un sous-ensemble limité de ALTER TABLE. La commande ALTER TABLE de SQLite permet à l’utilisateur de renommer une table ou d’append une nouvelle colonne à une table existante. Il est impossible de renommer une colonne, de supprimer une colonne ou d’append ou de supprimer des contraintes d’une table.

    ALTER TABLE SYNTAX

    En fouillant, j’ai trouvé cet outil graphique multiplateforme (Linux | Mac | Windows) appelé DB Browser pour SQLite qui permet en fait de renommer les colonnes de manière très conviviale!

    Modifier | Modifier le tableau | Sélectionnez le tableau | Modifier le champ Cliquez sur le clic! Voila!

    Cependant, si quelqu’un veut partager une manière de le faire, je serais heureux de le savoir!

    Récemment, j’ai dû le faire dans SQLite3 avec une table nommée points avec l’ identifiant colunms , lon, lat . Erroneusly, lorsque la table était imscope, les valeurs de latitude étaient stockées dans la colonne lon et vice-versa, donc une solution évidente serait de renommer ces colonnes. Donc, le tour était:

     create table points_tmp as select id, lon as lat, lat as lon from points; drop table points; alter table points_tmp rename to points; 

    J’espère que cela vous sera utile!

    Citant la documentation sqlite :

    SQLite prend en charge un sous-ensemble limité de ALTER TABLE. La commande ALTER TABLE de SQLite permet à l’utilisateur de renommer une table ou d’append une nouvelle colonne à une table existante. Il n’est pas possible de renommer une colonne, de supprimer une colonne ou d’append ou de supprimer des contraintes d’une table.

    Bien entendu, vous pouvez créer une nouvelle table avec la nouvelle disposition, SELECT * FROM old_table et remplir la nouvelle table avec les valeurs que vous recevrez.

    Tout d’abord, c’est une de ces choses qui me surprend avec la surprise: renommer une colonne nécessite de créer une table entièrement nouvelle et de copier les données de l’ancienne table dans la nouvelle table …

    L’interface graphique sur laquelle je suis arrivé pour effectuer des opérations SQLite est Base . Il a une fenêtre de journal astucieux qui montre toutes les commandes qui ont été exécutées. Le fait de renommer une colonne via Base remplit la fenêtre du journal avec les commandes nécessaires:

    Fenêtre de journal de base

    Celles-ci peuvent ensuite être facilement copiées et collées là où vous en avez besoin. Pour moi, c’est dans un fichier de migration ActiveAndroid . Une bonne idée est que les données copiées ne comprennent que les commandes SQLite, pas les horodatages, etc.

    J’espère que cela fera gagner du temps à certaines personnes.

    changer la colonne de la table en <_id>

      Ssortingng LastId = "id"; database.execSQL("ALTER TABLE " + PhraseContract.TABLE_NAME + " RENAME TO " + PhraseContract.TABLE_NAME + "old"); database.execSQL("CREATE TABLE " + PhraseContract.TABLE_NAME +"(" + PhraseContract.COLUMN_ID + " INTEGER PRIMARY KEY," + PhraseContract.COLUMN_PHRASE + " text ," + PhraseContract.COLUMN_ORDER + " text ," + PhraseContract.COLUMN_FROM_A_LANG + " text" +")" ); database.execSQL("INSERT INTO " + PhraseContract.TABLE_NAME + "("+ PhraseContract.COLUMN_ID +" , "+ PhraseContract.COLUMN_PHRASE + " , "+ PhraseContract.COLUMN_ORDER +" , "+ PhraseContract.COLUMN_FROM_A_LANG +")" + " SELECT " + LastId +" , "+ PhraseContract.COLUMN_PHRASE + " , "+ PhraseContract.COLUMN_ORDER +" , "+ PhraseContract.COLUMN_FROM_A_LANG + " FROM " + PhraseContract.TABLE_NAME + "old"); database.execSQL("DROP TABLE " + PhraseContract.TABLE_NAME + "old"); 

    Comme mentionné précédemment, il existe un outil SQLite Database Browser, qui fait cela. Lyckily, cet outil conserve un journal de toutes les opérations effectuées par l’utilisateur ou l’application. En faisant cela une fois et en regardant le journal des applications, vous verrez le code impliqué. Copiez la requête et collez-la si nécessaire. Travaillé pour moi J’espère que cela t’aides

    Créez une nouvelle colonne avec le nom de colonne souhaité: COLNew.

     ALTER TABLE {tableName} ADD COLUMN COLNew {type}; 

    Copier le contenu de l’ancienne colonne COLOld dans la nouvelle colonne COLNew.

     INSERT INTO {tableName} (COLNew) SELECT {COLOld} FROM {tableName} 

    Remarque: les crochets sont nécessaires dans la ligne ci-dessus.

    De la documentation officielle

    Une procédure plus simple et plus rapide peut éventuellement être utilisée pour certaines modifications qui n’affectent en rien le contenu sur disque. La procédure plus simple suivante est appropriée pour supprimer des contraintes CHECK ou FOREIGN KEY ou NOT NULL, renommer des colonnes ou append ou supprimer ou modifier des valeurs par défaut dans une colonne.

    1. Commencez une transaction.

    2. Exécutez PRAGMA schema_version pour déterminer le numéro de version du schéma actuel. Ce numéro sera nécessaire pour l’étape 6 ci-dessous.

    3. Activer la modification du schéma à l’aide de PRAGMA writable_schema = ON.

    4. Exécutez une instruction UPDATE pour modifier la définition de la table X dans la table sqlite_master: UPDATE sqlite_master SET sql = … WHERE type = ‘table’ AND name = ‘X’;

      Attention: Si vous modifiez la table sqlite_master, la firebase database sera corrompue et illisible si la modification contient une erreur de syntaxe. Il est suggéré de tester soigneusement l’instruction UPDATE sur une firebase database vierge distincte avant de l’utiliser sur une firebase database contenant des données importantes.

    5. Si la modification apscope à la table X affecte également d’autres tables ou index ou déclencheurs, il s’agit d’exécuter des instructions UPDATE pour modifier ces index et vues. Par exemple, si le nom d’une colonne change, toutes les contraintes, tous les déclencheurs, tous les index et toutes les vues FOREIGN KEY faisant référence à cette colonne doivent être modifiés.

      Attention: une fois de plus, apporter des modifications à la table sqlite_master comme cela rendra la firebase database corrompue et illisible si la modification contient une erreur. Testez soigneusement toute cette procédure sur une firebase database de test distincte avant de l’utiliser sur une firebase database contenant des données importantes et / ou faites des copies de sauvegarde des bases de données importantes avant d’exécuter cette procédure.

    6. Incrémentez le numéro de version du schéma à l’aide de PRAGMA schema_version = X où X est un de plus que l’ancien numéro de version de schéma trouvé à l’étape 2 ci-dessus.

    7. Désactiver l’édition de schéma à l’aide de PRAGMA writable_schema = OFF.

    8. (Facultatif) Exécutez PRAGMA integrity_check pour vérifier que les modifications apscopes au schéma n’ont pas endommagé la firebase database.

    9. Validez la transaction lancée à l’étape 1 ci-dessus.

    Une option, si vous en avez besoin dans un pincement, et si votre colonne initiale a été créée avec un défaut, consiste à créer la nouvelle colonne que vous voulez, à y copier le contenu et à “abandonner” l’ancienne colonne (elle rest présent, mais vous n’utilisez pas / ne le mettez pas à jour, etc.)

    ex:

     alter table TABLE_NAME ADD COLUMN new_column_name TYPE NOT NULL DEFAULT ''; update TABLE_NAME set new_column_name = old_column_name; update TABLE_NAME set old_column_name = ''; -- abandon old column, basically 

    Cela laisse une colonne (et si elle a été créée avec NOT NULL mais sans valeur par défaut, alors les insertions futures qui l’ignorent peuvent échouer), mais si ce n’est qu’une table jetable, les compromis pourraient être acceptables. Sinon, utilisez l’une des autres réponses mentionnées ici ou une autre firebase database permettant de renommer des colonnes.

    sqlite3 yourdb .dump> /tmp/db.txt
    modifier /tmp/db.txt modifier le nom de la colonne dans la ligne de création
    sqlite2 yourdb2 mv / move yourdb2 yourdb