Wenn Sie mit einem Fehler stecken bleiben Kann keine NOT NULL-Spalte mit dem Standardwert NULL hinzufügen während Sie die Neutronendatenbank füllen oder synchronisieren, können Sie das Problem wie folgt beheben. Bevor wir die Lösung sehen, werfen Sie einen Blick auf die Momentaufnahme des Fehlers:
# su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) Cannot add a NOT NULL column with default value NULL [SQL: u'ALTER TABLE address_scopes ADD COLUMN ip_version INTEGER NOT NULL']
Der Fehler ist seltsam, weil meine OpenStack-Installation eine MySQL-Datenbank verwendet, aber der Fehler sagt SQLite.
Lösung:
Da meine Installation die MySQL-Datenbank verwenden sollte, habe ich neutron.conf schnell überprüft Datei, um zu sehen, ob die Verbindungsvariable richtig gesetzt wurde. Überraschenderweise gab es eine zusätzliche Verbindungsvariable, die auf SQLite zeigte, und das war in meinem Fall der Übeltäter.
# vim /etc/neutron/neutron.conf
[database] connection = mysql+pymysql://neutron:osneutron@controller/neutron The SQLAlchemy connection string to use to connect to the database. (string # value) # Deprecated group/name - [DEFAULT]/sql_connection # Deprecated group/name - [DATABASE]/sql_connection # Deprecated group/name - [sql]/connection connection = sqlite:////var/lib/neutron/neutron.sqlite
Die Lösung bestand also darin, die Verbindungsvariable, die auf sqlite zeigt, auszukommentieren.
# connection = sqlite:////var/lib/neutron/neutron.sqlite
Das ist es! Wenn Sie wissen möchten, warum SQLite keine Spalte address_scopes hinzufügen konnte mit einer Einschränkung als NOT NULL auf eine vorhandene Tabelle, dann ist hier der Grund.
Gemäß der SQLite ALTER TABLE-Dokumentation muss die Spalte einen anderen Standardwert als NULL haben, wenn die Einschränkung NOT NULL angegeben ist.