[PYTHON] SQL-Anweisungsspezifikationen, die SQLite nicht unterstützt, und Umgang mit ALTER TABLE-Operationen

Einführung

SQLite3 ist einfach zu erstellen, leichtgewichtig und benutzerfreundlich, aber einige SQL-Anweisungen unterstützen es nicht und es gibt einige Schwierigkeiten. Beispielsweise unterstützen die Funktionen ALTER TABLE nur RENAME COLUMN und ADD COLUMN.

Es hat lange gedauert, bis diese Spezifikation erreicht war, und es ist ziemlich mühsam, damit umzugehen, daher werde ich sie als Erinnerung belassen. (Ich wollte die Tabellendefinition ändern, also wie es geht)

Wie macht man

Das allgemeine Verfahren ist wie folgt

  1. Rufen Sie die Anweisung CREATE TABLE der Originaltabelle ab
  2. Erstellen Sie eine temporäre Tabelle mit geänderter Schemadefinition basierend auf dem in 1 erhaltenen SQL.
  3. Fügen Sie die Daten der Originaltabelle in die in 2 erstellte Tabelle ein.
  4. DROP TABLE die Originaltabelle
  5. RENAME TABLE eine temporäre Tabelle

Es ist einfach zu machen, aber die zweite Operation ist ziemlich umständlich zu mechanisieren. Der untere Teil ist das, was ich mit Python zu unterstützen versucht habe. (Dennoch müssen Sie jedes Mal, wenn Sie die Schemadefinition ändern, diese festlegen ...)

SQLite3-Operation


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 = (  #Beispiel für die Änderung der temporären SQL-Tabellenerstellung
    create_table_sql
    .lower()
    .replace('target_table', 'temp_table')
    .replace(')', ', foreign key (test_fk) references test_table(id) )')  #Fügen Sie eine zusätzliche Anweisung für den externen Schlüssel ein
)
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()

Dies macht es schwierig, eine Tabelle mit komplizierten Verknüpfungsbeziehungen zu aktualisieren. Gibt es also eine andere Möglichkeit, dies zu tun? .. ..

Referenz

Recommended Posts

SQL-Anweisungsspezifikationen, die SQLite nicht unterstützt, und Umgang mit ALTER TABLE-Operationen
Verwendung der TP-Link-WLAN-Slave-Einheit, die Linux nicht unterstützt
So beheben Sie einen Fehler, bei dem das Jupyter-Notebook nicht automatisch gestartet wird
Datenbereinigung Umgang mit fehlenden und Ausreißern
Wie man mit dem Datum / Uhrzeit-Typ in Pythons SQLite3 umgeht