[PYTHON] Spécifications d'instructions SQL que SQLite ne prend pas en charge et comment gérer les opérations ALTER TABLE

introduction

SQLite3 est facile à construire, léger et facile à utiliser, mais certaines instructions SQL ne le prennent pas en charge et il y a quelques difficultés. Par exemple, les fonctions ALTER TABLE ne prennent en charge que RENAME COLUMN et ADD COLUMN.

Il a fallu beaucoup de temps pour atteindre cette spécification et il est assez difficile de la gérer, je vais donc la laisser pour rappel. (Je voulais changer la définition de la table, alors comment le faire)

Comment faire

La procédure générale est la suivante

  1. Obtenez l'instruction CREATE TABLE pour la table d'origine
  2. Créez une table temporaire avec une définition de schéma modifiée basée sur le SQL obtenu en 1.
  3. Insérez les données de la table d'origine dans la table créée en 2.
  4. DROP TABLE la table d'origine
  5. RENOMMER TABLE une table temporaire

C'est simple à faire, mais la deuxième opération est assez difficile à mécaniser. La partie inférieure est ce que j'ai essayé de supporter avec Python. (Pourtant, chaque fois que vous modifiez la définition de schéma, vous devez la définir ...)

Opération SQLite3


import sqlite3

con = sqlite3.connect('test.db')
cur = con.cursor()

create_table_sql = cur.execute("select sql from sqlite_master where name = 'target_table'").fetchone()[0]
create_temp_table_sql = (  #Exemple de modification du SQL de création de table temporaire
    create_table_sql
    .lower()
    .replace('target_table', 'temp_table')
    .replace(')', ', foreign key (test_fk) references test_table(id) )')  #Insérer une instruction supplémentaire pour la clé externe
)
cur.execute(create_temp_table_sql)
cur.execute('insert into temp_table select * from target_table')
cur.execute('drop table target_table')
cur.execute('alter table temp_table rename to target_table')

cur.close()
con.close()

Cela rend difficile la mise à jour d'une table avec des relations de jointure compliquées, alors existe-t-il un autre moyen de le faire? .. ..

référence

Recommended Posts

Spécifications d'instructions SQL que SQLite ne prend pas en charge et comment gérer les opérations ALTER TABLE
Comment utiliser l'unité esclave LAN sans fil tp-link qui ne prend pas en charge Linux
Comment corriger un bug qui empêche le notebook Jupyter de démarrer automatiquement
Nettoyage des données Comment gérer les valeurs manquantes et aberrantes
Comment gérer le type datetime dans sqlite3 de python