Accédez au serveur SQL de l'hôte avec python27 / pyodbc sur le conteneur

Aperçu

J'ai présenté l'autre jour comment accéder à mysql dans l'article suivant, Accédez à l'hôte mysql avec python3 / mysql-connector-python sur le conteneur Présentation de la version du serveur SQL.

supposition

Héberger SQL Server

ODBC Driver 17 for SQL Server Exécution sur le port 1443 avec l'authentification SQL Server

procédure

[Comment créer un conteneur Docker qui exécute ODBC] Clonez le référentiel suivant dans l'article (https://qiita.com/e_tyubo/items/9c01f92480d90fc8c092). https://github.com/Microsoft/mssql-docker/tree/master/oss-drivers/pyodbc

> git clone https://github.com/microsoft/mssql-docker.git
> cd mssql-docker/oss-drivers/pyodbc

Je pense qu'il a l'arbre suivant.

pyodbc
├── Dockerfile
├── README.md
├── docker-compose.yml *docker-Ajouté au lancement avec compose
├── entrypoint.sh
└── sample.py *Éditer Ou vous pouvez créer un autre fichier. Je n'ai pas de contact...

Dockerfile


# mssql-python-pyodbc
# Python runtime with pyodbc to connect to SQL Server
FROM ubuntu:16.04

# apt-get and system utilities
RUN apt-get update && apt-get install -y \
    curl apt-utils apt-transport-https debconf-utils gcc build-essential g++-5\
    && rm -rf /var/lib/apt/lists/*

# adding custom MS repository
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list

# install SQL Server drivers
RUN apt-get update && ACCEPT_EULA=Y apt-get install -y msodbcsql unixodbc-dev

# install SQL Server tools
RUN apt-get update && ACCEPT_EULA=Y apt-get install -y mssql-tools
RUN echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
RUN /bin/bash -c "source ~/.bashrc"

# python libraries
RUN apt-get update && apt-get install -y \
    python-pip python-dev python-setuptools \
    --no-install-recommends \
    && rm -rf /var/lib/apt/lists/*

# install necessary locales
RUN apt-get update && apt-get install -y locales \
    && echo "en_US.UTF-8 UTF-8" > /etc/locale.gen \
    && locale-gen
RUN pip install --upgrade pip

# install SQL Server Python SQL Server connector module - pyodbc
RUN pip install pyodbc

# install additional utilities
RUN apt-get update && apt-get install gettext nano vim -y

# add sample code
RUN mkdir /sample
ADD . /sample
WORKDIR /sample

CMD /bin/bash ./entrypoint.sh

docker-compose.yaml


version: '3'
services:
  pyodbc:
    restart: always
    build: .
    container_name: 'pyodbc'
    working_dir: '/sample'
    tty: true
    volumes:
      - .:/sample
    extra_hosts:
      - "(NOM DE L'ORDINATEUR Hôte):(Adresse IP de l'hôte)"
    ports:
      - 1443:1443

sample.py


import pyodbc


server = '(Adresse IP de l'hôte),(Port d'exploitation de l'hôte SQL Server)'
username = 'sa'
password = 'password'

cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';database=(Nom de la base de données);UID='+username+';PWD='+password)
cursor = cnxn.cursor()

print ('Using the following SQL Server version:')
tsql = "SELECT @@version;"
with cursor.execute(tsql):
    rows = cursor.fetchall()
    for row in rows:
        print(str(row))

> docker-compose up -d --build
...
> docker container ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
2c51574bfd36        pyodbc_pyodbc       "/bin/sh -c '/bin/ba…"   51 minutes ago      Up 51 minutes       0.0.0.0:1443->1443/tcp   pyodbc
> docker exec -it 2c51574bfd36 /bin/bash
$ python --version
Python 2.7.12
$ python sample.py
Using the following SQL Server version:
(u'Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64) \n\tAug 22 2017 17:04:49 \n\tCopyright (C) 2017 Microsoft Corporation\n\tExpress Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 18362: ) (Hypervisor)\n', )

résultat

J'ai pu accéder au serveur SQL et parcourir la base de données en toute sécurité.

Discussion ultérieure (contenu supplémentaire le 28 février 2020)

Une erreur se produit lors de la substitution d'une chaîne de caractères

Changements

sample.py


tsql = '''\
    SELECT *
FROM
	~
INNER JOIN
	~
ON
'''

contenu de l'erreur

$ python sample.py 
  File "sample.py", line 17
SyntaxError: Non-ASCII character '\xe7' in file sample.py on line 18, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

  File "sample.py", line 54, in <module>
    with cursor.execute(tsql):
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 48: ordinal not in range(128)

Procédure éprouvée

L'article suivant ne l'a pas résolu. http://shu223.hatenablog.com/entry/20111201/1328334689

L'article suivant ne l'a pas résolu. https://qiita.com/chatrate/items/eb4b05cd1a6652529fd9

Procédure résolue

Je l'ai résolu en me référant à ce qui suit. https://kaworu.jpn.org/python/Python%E3%81%AEUnicodeDecodeError%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95

sample.py


- with cursor.execute(tsql):
+ with cursor.execute(tsql.decode('utf-8')):

Révision ultérieure de la discussion (contenu supplémentaire le 29 février 2020)

Prend en charge l'adresse IP d'hôte variable

Il semble qu'il existe un alias appelé «host.docker.internal» depuis l'intérieur du conteneur qui pointe vers «% COMPUTERNAME%» dans le système d'exploitation hôte.

docker-compose.yml


-    extra_hosts:
-      - "(NOM DE L'ORDINATEUR Hôte):(Adresse IP de l'hôte)"

Recommended Posts

Accédez au serveur SQL de l'hôte avec python27 / pyodbc sur le conteneur
Accès ODBC à SQL Server depuis Linux avec Python
[Didacticiel d'analyse Python dans la base de données avec SQL Server 2017] Étape 6: Utilisation du modèle
[Didacticiel d'analyse Python en base de données avec SQL Server 2017]
Télécharger des fichiers sur le Web avec Python
Obtenez la largeur du div côté serveur avec Selenium + PhantomJS + Python
Déployer et utiliser le modèle de prédiction créé en Python sur SQL Server
Conseils de dessin avec matplotlib côté serveur
Introduction à Python avec Atom (en route)
Serveur local avec python
Commande Yum pour accéder à MySQL avec Python 3 sous Linux
Faire un point d'arrêt sur la couche c avec python
Informations pour contrôler les moteurs avec Python sur RaspberryPi
Installez django sur python + anaconda et démarrez le serveur
Test.py n'est pas reflété sur le serveur Web dans Python3.
Essayez d'extraire la table de données d'Azure SQL Server avec pyodbc
Lorsque vous accédez au serveur Web, L Chika avec Arduino
Serveur HTTP facile avec Python
Appelez l'API avec python3.
Accédez à Google Drive avec Python
Enregistrer des images sur le Web sur un lecteur avec Python (Colab)
Obtenez le nom d'hôte du PC hôte avec Docker sous Linux
Mettez Ubuntu dans Raspi, mettez Docker dessus et contrôlez GPIO avec python à partir du conteneur
Jeu de vie avec Python [je l'ai fait] (sur terminal et Tkinter)
Comment est le progrès? Continuons le boom ?? en Python
Contrôlez le moteur avec un pilote de moteur en utilisant python sur Raspberry Pi 3!
Premiers pas avec le framework Python Django sur Mac OS X
La synchronisation avec le serveur qui a porté ssh sur localhost échoue [Résolu]
Paramètres de démarrage du projet Dango sur le serveur avec Pycharm
[Didacticiel d'analyse Python dans la base de données avec SQL Server 2017] Étape 1: Télécharger des exemples de données
Héberger la bibliothèque réseau Mirror for Unity sur un serveur Linux
Extraire le fichier xz avec python
Installez Python 3 sur le serveur Sakura (FreeBSD)
Obtenez la météo avec les requêtes Python 2
Trouvez la distance d'édition (distance de Levenshtein) avec python
Accédez à l'API Etherpad-lite avec Python
Installer le plug-in Python avec Netbeans 8.0.2
J'ai aimé le tweet avec python. ..
Notes sur l'utilisation de rstrip avec python.
Maîtriser le type avec Python [compatible Python 3.9]
Obtenez le nom d'hôte en Python
Premiers pas avec Python 3.8 sous Windows
Sakura utilisant Python sur Internet
Accéder à l'API Twitter avec Python
Remarques sur l'utilisation de matplotlib sur le serveur
[Memo] Tweet sur Twitter avec Python
[Python] J'ai essayé de visualiser la nuit du chemin de fer de la galaxie avec WordCloud!
Mettez Cabocha 0.68 dans Windows et essayez d'analyser la dépendance avec Python
Utilisez python sur Raspberry Pi 3 pour éclairer la LED avec le contrôle du commutateur!
[Didacticiel d'analyse Python dans la base de données avec SQL Server 2017] Étape 3: Exploration et visualisation des données
Modifiez le fichier du serveur de destination de la connexion SSH sur le serveur avec VS Code
Que faire si le serveur ne démarre pas avec python manage.py runserver
Version 2019: analyse des tendances des accès non autorisés (exemple de serveur polyvalent sur le cloud)
J'ai essayé avec les 100 meilleurs packages PyPI> J'ai essayé de représenter graphiquement les packages installés sur Python
Lisez le fichier avec python et supprimez les sauts de ligne [Notes sur la lecture du fichier]
L Chika (compatible HTTPS) avec Arduino lors de l'accès au serveur Web
Comparez le retour nocturne et le retour diurne du cours moyen de l'action Nikkei avec Python
Janken Poi avec Python Exécutons sur un serveur local Windows pour les débutants