Drei Dinge, von denen ich süchtig war, als ich Python und MySQL mit Docker verwendete

Überblick

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.

Umgebung

Gastgeber

Die Gäste

Ich war süchtig nach

1. Ich kann keine Verbindung zur Befehlszeile herstellen, da ich den Befehl 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

2. "MySQLdb" ist nicht verfügbar und auf die Datenbank kann nicht über das Skript zugegriffen werden

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' 

3. Japanische Zeichenfolge konnte nicht verarbeitet werden

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.

Zusammenfassung

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

Drei Dinge, von denen ich süchtig war, als ich Python und MySQL mit Docker verwendete
Wovon ich süchtig war, als ich Python Tornado benutzte
Ich war süchtig danach, 2020 mit Selen (+ Python) zu kratzen
Ein Hinweis, dem ich beim Ausführen von Python mit Visual Studio Code verfallen war
Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war
Wovon ich süchtig war, als der Processing-Benutzer zu Python wechselte
Vorsichtsmaßnahmen bei der Verwendung von Python mit AtCoder
Dinge, die Sie bei der Verwendung von CGI mit Python beachten sollten.
Ich kenne? Datenanalyse mit Python oder Dingen, die Sie mit numpy verwenden möchten, wenn Sie möchten
Wovon ich süchtig war, als ich ALE in Vim für Python einführte
Was ich mit json.dumps in Pythons base64-Codierung süchtig gemacht habe
Stellen Sie mit Python in Docker eine Verbindung zu MySQL her
Ein Hinweis, dem ich beim Erstellen einer Tabelle mit SQL Alchemy verfallen war
Ich war süchtig nach falschen Klassenvariablen und Instanzvariablen in Python
Was ich süchtig nach Python Autorun war
Als ich versuchte, mithilfe von Anforderungen in Python zu kratzen, war ich süchtig nach SSLError, also einem Workaround-Memo
Ich war süchtig danach, eine Python-Venv-Umgebung mit VS Code zu erstellen
Verwenden Sie Python aus Java mit Jython. Ich war auch süchtig danach.
Der Dateiname war in Python schlecht und ich war süchtig nach Import
Wovon ich süchtig war, als ich mein eigenes neuronales Netzwerk mit den Gewichten und Vorurteilen aufbaute, die ich mit dem MLP-Klassifikator von scikit-learn bekam.
[Python] Als ich versuchte, ein Dekomprimierungswerkzeug mit einer Zip-Datei zu erstellen, die ich gerade kannte, war ich süchtig nach sys.exit ()
Docker x Visualization hat nicht funktioniert und ich war süchtig danach, also habe ich es zusammengefasst!
Ich möchte die Optimierung mit Python und CPlex behandeln
Wovon ich süchtig war, als ich Klassenvererbung und gemeinsame Tabellenvererbung in SQLAlchemy kombinierte
Ich habe versucht, ein Projekt mit Python on Docker mit PyCharm zu erstellen, aber es hat mit Docker Compose funktioniert
[IOS] GIF-Animation mit Pythonista3. Ich war süchtig danach.
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
[Fix] Ich war süchtig nach dem alphanumerischen Urteil über Python-Strings
Ich war überrascht, eine nette Rezension zu erhalten, als ich Python an CheckIO und seine Erklärung schrieb
Wovon ich süchtig war, als ich mit riesigen Dateien in einer Linux 32-Bit-Umgebung umging
Ich möchte einen Sprachwechsler mit Python und SPTK in Bezug auf eine berühmte Site erstellen
Erstellen Sie eine MySQL + Python-Umgebung mit Docker
Ich habe mit PyQt5 und Python3 gespielt
Ich möchte mit Python debuggen
Bei Verwendung von MeCab mit virtualenv python
Vorsichtsmaßnahmen bei Verwendung von sechs mit Python 2.5
Ich war süchtig nach Multiprocessing + Psycopg2
Dinge, auf die Sie achten müssen, wenn Sie Standardargumente in Python verwenden
Die Platte, von der ich süchtig war, als ich MeCab in Heroku einsetzte
Ich möchte APG4b mit Python lösen (nur 4.01 und 4.04 in Kapitel 4)
Ein Hinweis, von dem ich süchtig war, als ich unter Linux einen Piepton machte
[Python] Fehler- und Lösungsnotiz bei Verwendung von venv mit pyenv + anaconda
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Umgang mit Fehlern bei der Installation von Python und Pip mit Choco
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
Ich habe versucht, Gesichtsmarkierungen mit Python und Dlib leicht zu erkennen
Eine Geschichte über das Schreiben von AWS Lambda und ein wenig Abhängigkeit von den Standardwerten von Python-Argumenten
Mir wurde gesagt, dass ich XML_SetHashSalt nicht finden konnte, als ich versuchte, pip mit Python zu verwenden.
Beachten Sie, dass ich süchtig danach war, mit Pythons mysql.connector über eine Webanwendung auf die Datenbank zuzugreifen
Ich war überrascht, wie man Objekte mit Python speichert, was schlank und sehr energiesparend ist.
Als ich Django in mein Home-Verzeichnis legte, wurde ich mit einem Berechtigungsfehler in eine statische Datei eingebunden
Zwei Dinge, die ich süchtig danach war, Django + Apache + Nginx unter Windows zu erstellen
Von Python bis zur Verwendung von MeCab (und CaboCha)
[Data Science-Grundlagen] Ich habe versucht, mit Python von CSV auf MySQL zu speichern
Als ich versuchte, Python auszuführen, wurde ich zum Microsoft Store übersprungen
Ich war süchtig danach, Tensorflow auf einer GPU mit dem NVIDIA-Treiber 440 + CUDA 10.2 auszuführen
Hinter dem Flyer: Docker mit Python verwenden
Ich habe einen Musik-Bot mit discord.py und der Google Drive-API erstellt (getestet mit Docker → bereitgestellt für Heroku).