[PYTHON] [Lösung] Wenn ich versuche, mit GAE eine Verbindung zu CloudSQL herzustellen, wird nur bei dev_appserver ein ImportError angezeigt.

Ich bin süchtig danach, Google App Engine (Python) für meine Forschung zu verwenden. Ich entwickle einen Webdienst mit Flask mit GAE + CloudSQL. Wenn ich versuche, mit SQLAlchemy eine Verbindung zu CloudSQL von Flask aus herzustellen, wird eine Fehlermeldung angezeigt. Anscheinend erhalte ich den Fehler ImportError: Kein Modulname _mysql beim Versuch , MySQLdb zu importieren. Darüber hinaus tritt dieser Fehler nur auf, wenn versucht wird, das Verhalten lokal mit "dev_appserver.py" zu überprüfen.

Das Fehlerprotokoll lautet wie folgt. (Ich erhalte eine Fehlermeldung, wenn "sqlalchemy.create_engine ()" ausgeführt wird, wenn auf "/ user" zugegriffen wird.)

$ dev_appserver.py app.yaml                                                                             
INFO     2017-07-27 05:57:06,227 sdk_update_checker.py:231] Checking for updates to the SDK.
INFO     2017-07-27 05:57:06,541 api_server.py:297] Starting API server at: http://localhost:52746
INFO     2017-07-27 05:57:06,545 dispatcher.py:209] Starting module "test" running at: http://localhost:8080
INFO     2017-07-27 05:57:06,548 admin_server.py:116] Starting admin server at: http://localhost:8000
WARNING  2017-07-27 05:57:06,548 devappserver2.py:187] No default module found. Ignoring.
INFO     2017-07-27 05:57:17,859 server.py:125] Server initialized for threading.
ERROR    2017-07-27 05:57:17,875 wsgi.py:263] 
Traceback (most recent call last):
  File "/Users/test/Desktop/study/gae/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 240, in Handle
    handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
  File "/Users/test/Desktop/study/gae/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 299, in _LoadHandler
    handler, path, err = LoadObject(self._handler)
  File "/Users/test/Desktop/study/gae/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 85, in LoadObject
    obj = __import__(path[0])
  File "/Users/test/Desktop/test/test/main.py", line 30, in <module>
    engine = create_engine(url, echo=True)
  File "/Users/test/Desktop/test/test/lib/sqlalchemy/engine/__init__.py", line 387, in create_engine
    return strategy.create(*args, **kwargs)
  File "/Users/test/Desktop/test/test/lib/sqlalchemy/engine/strategies.py", line 80, in create
    dbapi = dialect_cls.dbapi(**dbapi_args)
  File "/Users/test/Desktop/test/test/lib/sqlalchemy/dialects/mysql/mysqldb.py", line 110, in dbapi
    return __import__('MySQLdb')
  File "/Users/test/Desktop/test/test/lib/MySQLdb/__init__.py", line 19, in <module>
    import _mysql
  File "/Users/test/Desktop/study/gae/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/python/sandbox.py", line 1024, in load_module
    raise ImportError('No module named %s' % fullname)
ImportError: No module named _mysql
INFO     2017-07-27 05:57:17,882 module.py:809] test: "GET /user HTTP/1.1" 500 -

(* Ersetzen Sie das Teil, das Sie geheim halten möchten, durch "Test".)

app.yaml und appengine_config.py lauten wie folgt.

app.yaml


module: test
runtime: python27
api_version: 1
threadsafe: yes

handlers:
- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: .*
  script: main.app

libraries:
- name: MySQLdb
  version: "1.2.5"

appengine_config.py


from google.appengine.ext import vendor

# Add any libraries install in the "lib" folder.
vendor.add('lib')

Die Bibliotheken werden im Verzeichnis "lib" installiert.

requirements.txt


Flask==0.10.1
Flask_SocketIO
itsdangerous==0.24
Jinja2==2.7.3
MarkupSafe==0.23
python-engineio
python-socketio
six==1.9.0
Werkzeug==0.10.4
sqlalchemy==1.1.9
mysql-python==1.2.5
$ sudo pip install -t lib -r requirements.txt

Als Test habe ich "MySQLdb" in mein lokales Python importiert und keinen Fehler erhalten.

Python 2.7.9 (default, May  9 2017, 14:55:04) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import MySQLdb
>>> 

Als ich es als "dev" -Version in die GAE-Umgebung einbaute, wurde es als weitere Testversion ohne Probleme bereitgestellt. Ich konnte die Verbindung zu CloudSQL problemlos bestätigen.

$ appcfg.py -A test-project -V dev update app.yaml
03:15 PM Host: appengine.google.com
03:15 PM Application: test-project (was: None); module: test; version: dev (was: None)
03:15 PM Starting update of app: test-project, module: test, version: dev
03:15 PM Getting current resource limits.
03:15 PM Scanning files on local disk.
03:15 PM Scanned 500 files.
03:15 PM Cloning 544 application files.
03:15 PM Compilation starting.
03:16 PM Compilation completed.
03:16 PM Starting deployment.
03:16 PM Checking if deployment succeeded.
03:16 PM Deployment successful.
03:16 PM Checking if updated app version is serving.
03:16 PM Completed update of app: test-project, module: test, version: dev
$

_mysql geht nur verloren, wenn es mit dev_appserver.py in der lokalen Umgebung bereitgestellt wird.

Wir werden das Problem weiterhin lösen. (Es ist ein Schmerz, wenn Sie das Verhalten von CSS oder JS nicht lokal überprüfen können)


(Ergänzung: 27.07.2017 18:50)

_mysql geht nur verloren, wenn es mit dev_appserver.py in der lokalen Umgebung bereitgestellt wird.

Als ich das umging, stieß ich auf den folgenden Stackoverflow.

google app engine - how to add lib folder?

appengine_config.py will run in the GAE environment or when you run dev_appserver, which emulates the GAE environment. However if you're ever running outside of a GAE environment, make sure your PYTHONPATH includes the lib folder you want to import from.

Mit anderen Worten, appengine_config.py wird nicht ausgeführt, wenn dev_appserver.py lokal ausgeführt wird. Fügen Sie daher das Verzeichnis lib zu PYTHONPATH hinzu.

Stellen Sie "PYTHONPATH" genau so ein, wie es ist.

$ export PYTHONPATH=/Users/test/Desktop/test/test/lib:$PYTHONPATH

Es hat funktioniert, als ich es ausgeführt habe.

(Danach habe ich die offizielle Dokumentation gelesen und niemanden gefunden, der die Beziehung zwischen "dev_appserver.py" und "appengine_config.py" ... orz klar angegeben hat.)

Ich bin froh, dass ich es vorerst gelöst habe. Probleme können durch Zusammenfassen in Sätzen gelöst werden.

Recommended Posts

[Lösung] Wenn ich versuche, mit GAE eine Verbindung zu CloudSQL herzustellen, wird nur bei dev_appserver ein ImportError angezeigt.
Ich erhalte eine Fehlermeldung, wenn ich versuche, Python mit pyenv in Catalina auf 3 Serien zu erhöhen
Beim Versuch, maec 4.0.1.0 mit pip zu installieren, wird eine Fehlermeldung angezeigt
Ich erhalte einen UnicodeDecodeError, wenn ich versuche, mit Python sqlalchemy eine Verbindung zu Oracle herzustellen
Ich habe versucht, mit AWS Lambda einen AMI zu erhalten
Bei der Verwendung von Tensorboard mit Pytorch ist ein Fehler aufgetreten
Wenn ich versuche, mysqlclient mit Django zu installieren, wird die Fehlermeldung angezeigt: Befehl 'gcc' ist mit dem Exit-Status 1 fehlgeschlagen.
Wenn ich versuche, mit Heroku zu pushen, funktioniert es nicht
Ich erhalte [Fehler 2055], wenn ich versuche, mit Heroku eine Verbindung zu MySQL herzustellen
Wenn ich versuche, mit mysql-connector-python eine Verbindung zu MySQL herzustellen, kann ich keine Verbindung mit dem Fehler "SSL-Verbindungsfehler: SSL_CTX_set_tmp_dh fehlgeschlagen" herstellen.
Ein Memorandum beim automatischen Erwerb mit Selen
Wenn ich eine Fehlermeldung mit Pylint unter Windows Atom erhalte
Wenn Sie ein Objekt mit Anforderungen mithilfe der Flasche senden möchten
Ich erhalte einen ImportError in appengine_config.py
Versuchen Sie, Statistiken mit e-Stat abzurufen
Beim Versuch, Xgboost und seine Lösung zu installieren, ist ein Fehler aufgetreten
Ich möchte ein Ubuntu Chrome-Benutzerprofil nur mit Colab erstellen
Wenn ich mit Chainer zurückkehre, passt es ein wenig
Versuchen Sie, die Datenbank unter IBM i mit Python + JDBC mithilfe von JayDeBeApi zu starten
Ich erhalte eine Fehlermeldung beim Import von Pandas.
Ich habe versucht, mit Hy anzufangen
Versuchen Sie, ein Bild mit Entfremdung zu erzeugen
Wenn ich versuche, django und postgresql mit Docker zu verbinden, wird die Fehlermeldung "django.db.utils.OperationalError: Hostname" db "konnte nicht in Adresse übersetzt werden: Name oder Dienst nicht bekannt"
Problemumgehung, wenn beim Versuch, PySide mit pip zu installieren, eine Fehlermeldung angezeigt wird
Drei Dinge, von denen ich süchtig war, als ich Python und MySQL mit Docker verwendete
Als ich mit VScode eine Verbindung zu einem entfernten Jupyter-Server herstellte, war dieser entfernt, aber lokal.
Was tun, wenn bei der Installation von Python mit pyenv eine Fehlermeldung angezeigt wird?
Wenn ich versuche, Jupiter Notebook auf einem Mac zu verwenden, kann ich nur Python2 auswählen
Ich habe versucht, eine Umgebung zu erstellen, um regelmäßig mit Selenium mit AWS Fargate zu überprüfen
Beim Speichern mit OpenCV ist ein Fehler aufgetreten
Ich habe versucht, durch Schaben ein Bild zu bekommen
Ich möchte OREMO mit setParam sein!
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich erhalte einen UnicodeDecodeError, wenn ich mit mod_wsgi laufe
Vorsichtsmaßnahmen bei Verwendung der Google Cloud-Bibliothek mit GAE / py
Ich habe versucht, ein Objekt mit M2Det zu erkennen!
Versuchen Sie, mit Node.js einen HTTP-Server zu erstellen
Ich erhalte eine Fehlermeldung mit allen yum-Befehlen
[Python] Ich möchte nur den Index verwenden, wenn ich eine Liste mit einer for-Anweisung schleife
Was tun, wenn bei der Installation von Python 2 mit pyenv ein OpenSSL-Fehler auftritt?
Jedes Mal, wenn ich versuche, eine CSV-Datei mit Pandas zu lesen, wird ein numpy-Fehler angezeigt.
Wenn ich versuche, Pandas unter macOS zu importieren, wird die Fehlermeldung Kein Modul mit dem Namen'_bz2 'angezeigt.
Ich möchte eine Fehlermeldung auf Japanisch mit dem Django-Passwortänderungsformular ausgeben
Was tun, wenn beim Importieren von matplotlib mit Jupyter ein Importfehler auftritt?
Ich möchte nur Pods mit dem angegebenen Label mit Label Selector in Client-go extrahieren
Wenn ich versuche, die Daten in DynamoDB mit Python (boto3) zu aktualisieren, wird "ExpressionAttributeNames enthält ungültigen Schlüssel: Syntaxfehler; Schlüssel: <Schlüsselname>" angezeigt.