Trois choses auxquelles j'étais accro lors de l'utilisation de Python et MySQL avec Docker

Aperçu

À partir d'un conteneur Python lancé avec Docker J'étais accro à diverses choses lors de l'utilisation du conteneur MySQL, je vais donc le résumer.

environnement

hôte

Les invités

J'étais accro à

1. Je ne peux pas me connecter avec la ligne de commande car je ne trouve pas la commande mysql.

Lors du développement à l'aide de Docker Je pense qu'il y a de nombreux cas où Alpine Linux est utilisé pour réduire le poids du conteneur. Bien que légères et rapides à démarrer, de nombreuses commandes doivent être installées seules.

Lors de la connexion à un conteneur MySQL depuis un conteneur Alpine Linux sur la ligne de commande Bien sûr, la commande mysql n'est pas incluse Installez à l'aide de l'outil de gestion de packages apk comme suit.

Installer le client


$ apk update
$ apk add mariadb-client

Bien que ce soit mariadb, il peut être utilisé avec MySQL sans aucun problème. Je n'ai pas gardé le serveur DB sur localhost, donc j'ai installé uniquement le client.

Vous pouvez maintenant utiliser MySQL sur la ligne de commande en entrant la commande comme suit.

Commande de connexion (veuillez remplacer le nom d'hôte et le nom d'utilisateur)


$ mysql -h {host} -u {user} -p

2. MySQLdb n'est pas disponible et la base de données n'est pas accessible à partir du script

Lors du développement d'une application Web avec Python Je pense que vous accédez souvent à la base de données en utilisant SQLAlchemy comme ORM. (L'exception est Django car il a son propre ORM)

D'après la documentation Flask-SQL Alchemy, j'ai d'abord écrit:

config.py


SQLALCHEMY_DATABASE_URI = 'mysql://username:password@server/db' 

Une erreur se produit si vous accédez à la base de données avec ce paramètre.

Journal des erreurs


$ ImportError: No module named 'MySQLdb'

J'essaye donc l'installation comme ci-dessous, mais cela ne fonctionne pas.

Installer MySQLdb


$ pip install MySQL-python

Journal des erreurs


$ ImportError: No module named 'ConfigParser'

Un rapide coup d'œil à ce point montre que MySQLdb n'est pas disponible dans Python 3. J'ai vu des façons de l'utiliser dans certains articles Il n'y a aucune raison de s'en tenir à MySQLdb cette fois, nous allons donc considérer d'autres bibliothèques.

Si vous regardez la documentation SQL Alchemy, cela ressemble à [PyMySQL](https: // github.com/PyMySQL/PyMySQL) est le finaliste J'ai choisi cela car la compatibilité ne semble pas poser de problème (bien que la lecture en anglais soit ambiguë). J'ai installé et modifié la configuration comme suit et confirmé le fonctionnement normal.

Installez PyMySQL


$ pip install PyMySQL

config.py


SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://username:password@server/db' 

3. Échec du traitement de la chaîne de caractères japonais

Si vous utilisez Python, vous serez bloqué avec le traitement japonais. Cette fois, l'erreur suivante s'est produite lors de l'insertion d'une chaîne de caractères japonais dans la base de données.

Erreur


sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1366, "Incorrect string value: '\\xE9\\x98\\xBF\\xE4\\xBA\\x95...' for column 'name' at row 1")

Ce qui suit est spécifié dans la ligne shebang du script à utiliser.

xxx.py


# -*- coding: utf-8 -*- 

S'il y a un autre problème, je pense que c'est le réglage du code de caractère du côté MySQL. Vérifiez les paramètres de la ligne de commande mysql comme suit:

Vérifiez les paramètres MySQL


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)

Il est vraiment suspect que «latin1» soit mélangé. Il n'y a pas de mérite particulier tel qu'il est, alors je voudrais le changer.

Je pense que le moyen le plus décent est de définir my.cnf Cette fois, j'exécute le serveur MySQL en tant que conteneur, il est donc difficile de changer. Donc, j'ai pensé à configurer cela lors de la configuration du conteneur en premier lieu.

À la suite de l'enquête, les pages suivantes ont été très utiles. Spécifiez le code de caractère dans l'image officielle MySQL de Docker Image officielle de 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.

(Traduction japonaise) Vous pouvez passer de nombreuses options à mysqld comme indicateurs. Cela vous donne la flexibilité de personnaliser votre conteneur sans avoir besoin d'un fichier cnf.

Parce que docker-compose est utilisé dans mon environnement Ajoutez la description suivante à docker-compose.yml.

docker-compose.yml


command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci

Vérifiez à nouveau les paramètres MySQL.

Vérifiez les paramètres MySQL


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 et character_set_server ont changé en ʻutf-8`. J'ai pu insérer le japonais en toute sécurité dans cet état.

Résumé

Il y a quelques problèmes dus à la création d'un serveur DB avec un conteneur, Puisque l'environnement peut être créé simplement en cliquant avec la commande docker-compose Une fois que vous vous y êtes habitué, vous pouvez accélérer le développement.

En passant, j'ai introduit trois points auxquels je suis accro cette fois. Il est souvent possible qu'il augmente à mesure que vous l'utiliserez à l'avenir.

Recommended Posts

Trois choses auxquelles j'étais accro lors de l'utilisation de Python et MySQL avec Docker
Ce à quoi j'étais accro lors de l'utilisation de Python tornado
J'étais accro au grattage avec Selenium (+ Python) en 2020
Une note à laquelle j'étais accro lors de l'exécution de Python avec Visual Studio Code
Une histoire à laquelle j'étais accro après la communication SFTP avec python
Ce à quoi j'étais accro lorsque l'utilisateur de traitement est passé à Python
Précautions lors de l'utilisation de Python avec AtCoder
Choses à garder à l'esprit lors de l'utilisation de cgi avec python.
Je connais? Analyse de données à l'aide de Python ou de choses que vous souhaitez utiliser quand vous le souhaitez avec numpy
Ce à quoi j'étais accro en présentant ALE à Vim pour Python
Ce à quoi j'étais accro avec json.dumps dans l'encodage base64 de Python
Connectez-vous à MySQL avec Python dans Docker
Une note à laquelle j'étais accro lors de la création d'une table avec SQL Alchemy
J'étais accro aux variables de classe et aux variables d'instance erronées en Python
Ce que j'étais accro à Python autorun
Quand j'ai essayé de gratter en utilisant des requêtes en python, j'étais accro à SSLError, donc un mémo de contournement
J'étais accro à la création d'un environnement Python venv avec VS Code
Utilisez Python de Java avec Jython. J'étais aussi accro.
Le nom du fichier était mauvais en Python et j'étais accro à l'importation
Ce à quoi j'étais accro lorsque j'ai construit mon propre réseau de neurones en utilisant les poids et les biais que j'ai obtenus avec le classificateur MLP de scikit-learn.
[Python] Quand j'ai essayé de créer un outil de décompression avec un fichier zip que je connaissais juste, j'étais accro à sys.exit ()
Docker x Visualization ne fonctionnait pas et j'en étais accro, alors je l'ai résumé!
Je veux gérer l'optimisation avec python et cplex
Ce à quoi j'étais accro en combinant l'héritage de classe et l'héritage de table commune dans SQLAlchemy
J'ai essayé de créer un projet en utilisant Python sur Docker avec PyCharm, mais cela a fonctionné avec Docker Compose
[IOS] Animation GIF avec Pythonista3. J'en étais accro.
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
[Réparer] J'étais accro au jugement alphanumérique des chaînes Python
J'ai été surpris de recevoir une belle critique lorsque j'ai écrit Python à CheckIO et son explication
Ce à quoi j'étais accro en traitant d'énormes fichiers dans un environnement Linux 32 bits
Je veux faire un changeur de voix en utilisant Python et SPTK en référence à un site célèbre
Construire un environnement Mysql + Python avec docker
J'ai joué avec PyQt5 et Python3
Je veux déboguer avec Python
Lors de l'utilisation de MeCab avec python dans virtualenv
Précautions lors de l'utilisation de six avec Python 2.5
J'étais accro au multitraitement + psycopg2
Choses à surveiller lors de l'utilisation d'arguments par défaut en Python
Le record auquel j'étais accro en mettant MeCab dans Heroku
Je veux résoudre APG4b avec Python (seulement 4.01 et 4.04 au chapitre 4)
Une note à laquelle j'étais accro lors de l'émission d'un bip sous Linux
[Python] Mémo d'erreur et de solution lors de l'utilisation de venv avec pyenv + anaconda
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
Comment gérer les erreurs lors de l'installation de Python et de pip avec choco
J'ai essayé de créer une application todo en utilisant une bouteille avec python
J'ai essayé de détecter facilement les points de repère du visage avec python et dlib
Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python
On m'a dit que je ne pouvais pas trouver XML_SetHashSalt lorsque j'ai essayé d'utiliser pip avec python.
Notez que j'étais accro à accéder à la base de données avec mysql.connector de Python en utilisant une application Web
J'ai été surpris de savoir comment enregistrer des objets avec python, qui est léger et très économe en énergie.
Lorsque j'ai mis Django dans mon répertoire personnel, je suis devenu accro à un fichier statique avec une erreur d'autorisation
Deux choses dont j'étais accro à la construction de Django + Apache + Nginx sous Windows
De Python à l'utilisation de MeCab (et CaboCha)
[Bases de la science des données] J'ai essayé d'enregistrer de csv à mysql avec python
Lorsque j'ai essayé d'exécuter Python, j'ai été ignoré dans le Microsoft Store
J'étais accro à l'exécution de tensorflow sur GPU avec le pilote NVIDIA 440 + CUDA 10.2
Derrière le flyer: utiliser Docker avec Python
J'ai créé un robot musical en utilisant discord.py et l'API Google Drive (testé avec Docker → déployé sur Heroku)