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)
La procédure générale est la suivante
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? .. ..
Recommended Posts