Aus einem Python-Container, der mit Docker gestartet wurde Ich war bei der Verwendung des MySQL-Containers von verschiedenen Dingen abhängig, daher werde ich es zusammenfassen.
3.5.2-alpine
)mysql
nicht finden kann.Bei der Entwicklung mit Docker Ich denke, es gibt viele Fälle, in denen Alpine Linux verwendet wird, um das Gewicht des Containers zu reduzieren. Viele Befehle sind zwar leicht und schnell zu starten, müssen jedoch selbst installiert werden.
Beim Herstellen einer Verbindung zu einem MySQL-Container über einen Alpine Linux-Container in der Befehlszeile
Natürlich ist der Befehl mysql
nicht enthalten
Installieren Sie mit dem Paketverwaltungstool apk wie folgt.
Client installieren
$ apk update
$ apk add mariadb-client
Obwohl es "mariadb" ist, kann es problemlos mit MySQL verwendet werden. Da der DB-Server nicht in localhost gespeichert ist, habe ich nur den Client installiert.
Jetzt können Sie MySQL in der Befehlszeile ausführen, indem Sie den Befehl wie folgt eingeben.
Verbindungsbefehl (Bitte ersetzen Sie den Hostnamen und den Benutzernamen)
$ mysql -h {host} -u {user} -p
Bei der Entwicklung einer Webanwendung mit Python Ich denke, dass Sie häufig mit SQLAlchemy als ORM auf die Datenbank zugreifen. (Die Ausnahme ist Django, da es ein eigenes ORM hat.)
Gemäß der Flask-SQL Alchemy-Dokumentation schrieb ich zunächst:
config.py
SQLALCHEMY_DATABASE_URI = 'mysql://username:password@server/db'
Ein Fehler tritt auf, wenn Sie mit dieser Einstellung auf die Datenbank zugreifen.
Fehlerprotokoll
$ ImportError: No module named 'MySQLdb'
Also versuche ich die Installation wie folgt, aber es funktioniert nicht.
MySQLdb installieren
$ pip install MySQL-python
Fehlerprotokoll
$ ImportError: No module named 'ConfigParser'
Ein kurzer Blick auf diesen Punkt zeigt, dass MySQLdb in Python 3 nicht verfügbar ist. Ich habe in einigen Artikeln einige Möglichkeiten gesehen, es zu verwenden Diesmal gibt es keinen Grund, sich an MySQLdb zu halten, daher werden wir andere Bibliotheken in Betracht ziehen.
Wenn Sie sich SQL Alchemy-Dokumentation ansehen, sieht es aus wie [PyMySQL](https: // github.com/PyMySQL/PyMySQL) ist der Zweitplatzierte Ich habe mich dafür entschieden, weil die Kompatibilität kein Problem zu sein scheint (obwohl die englische Lesart nicht eindeutig ist). Ich habe die Konfiguration wie folgt installiert und geändert und den normalen Betrieb bestätigt.
Installieren Sie PyMySQL
$ pip install PyMySQL
config.py
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://username:password@server/db'
Wenn Sie Python verwenden, bleiben Sie bei der japanischen Verarbeitung hängen. Diesmal trat der folgende Fehler beim Einfügen einer japanischen Zeichenfolge in die Datenbank auf.
Error
sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1366, "Incorrect string value: '\\xE9\\x98\\xBF\\xE4\\xBA\\x95...' for column 'name' at row 1")
Folgendes wird in der Shebang-Zeile des zu verwendenden Skripts angegeben.
xxx.py
# -*- coding: utf-8 -*-
Wenn es ein anderes Problem gibt, denke ich, dass es die Zeichencodeeinstellung auf der MySQL-Seite ist. Überprüfen Sie die Einstellungen in der Befehlszeile "mysql" wie folgt:
Überprüfen Sie die MySQL-Einstellungen
MySQL [(none)]> SHOW VARIABLES LIKE 'chara%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)
Es ist wirklich verdächtig, dass latin1
gemischt ist.
Es gibt keinen besonderen Verdienst, deshalb möchte ich ihn ändern.
Ich denke, der anständigste Weg ist, "my.cnf" zu setzen Dieses Mal führe ich den MySQL-Server als Container aus, daher ist es schwierig, Änderungen vorzunehmen. Also habe ich darüber nachgedacht, dies beim Einrichten des Containers einzustellen.
Als Ergebnis der Untersuchung waren die folgenden Seiten sehr hilfreich. Geben Sie den Zeichencode im offiziellen Bild von MySQL of Docker an Offizielles Bild von MySQL
Many configuration options can be passed as flags to mysqld. This will give you the flexibility to customize the container without needing a cnf file.
(Japanische Übersetzung) Sie können mysqld viele Optionen als Flags übergeben. Dies gibt Ihnen die Flexibilität, Ihren Container anzupassen, ohne dass eine "cnf" -Datei erforderlich ist.
Weil Docker-Compose in meiner Umgebung verwendet wird Fügen Sie die folgende Beschreibung zu "docker-compose.yml" hinzu.
docker-compose.yml
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
Überprüfen Sie die MySQL-Einstellungen erneut.
Überprüfen Sie die MySQL-Einstellungen
MySQL [(none)]> SHOW VARIABLES LIKE 'chara%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)
character_set_database
und character_set_server
wurden in utf-8
geändert.
In diesem Zustand konnte ich Japanisch sicher einfügen.
Es gibt einige Probleme aufgrund der Tatsache, dass der DB-Server im Container erstellt wird.
Da die Umgebung nur durch Klicken mit dem Befehl docker-compose
erstellt werden kann
Sobald Sie sich daran gewöhnt haben, können Sie die Entwicklung beschleunigen.
Übrigens habe ich drei Punkte vorgestellt, von denen ich diesmal süchtig bin. Es besteht oft die Möglichkeit, dass es zunimmt, wenn Sie es in Zukunft verwenden.
Recommended Posts