7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ubuntu+MySQL(on Docker)+SQLAlchemyを構築する際の手順、ハマりポイント

Last updated at Posted at 2019-01-23

環境

  • Ubuntu 18.04
  • Mysql(on docker)
  • Python3.6
  • SQLAlchemy

手順

MySQLイメージの作成、起動まで

docker pull mysql
docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql

DB作成

docker exec -it e5edc5732d78 bash
mysql> CREATE DATABASE test;

SQLAlchemyのインストール

pip3 install SQLAlchemy

コード

参考:https://qiita.com/bokotomo/items/a762b1bc0f192a55eae8
実行するとUserテーブルがない場合にはユーザーテーブルを作成してくれます。

import sys
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Float, DateTime

DATABASE = 'mysql://%s:%s@%s/%s?charset=utf8' % (
    "root",
    "mysql",
    "127.0.0.1",
    "test",
)
ENGINE = create_engine(
    DATABASE,
    encoding = "utf-8",
    echo=True
)

session = scoped_session(
    sessionmaker(
        autocommit = False,
        autoflush = False,
        bind = ENGINE
    )
)

Base = declarative_base()
Base.query = session.query_property()

class User(Base):
    __tablename__ = 'users'
    id = Column('id', Integer, primary_key = True)
    name = Column('name', String(200))
    age = Column('age', Integer)
    email = Column('email', String(100))

def main(args):
    Base.metadata.create_all(bind=ENGINE)

if __name__ == "__main__":
    main(sys.argv)

躓いたところ1

SQLAlchemyの依存パッケージが足りない

ModuleNotFoundError: No module named 'MySQLdb'

ここでインストールするパッケージはMySQLdbでもMySQL-pythonでもないです。
正しい必要なパッケージインストールはこれ!

pip3 install mysqlclient

まぁ怒られるんですけども。。。

OSError: mysql_config not found

解決方法は以下

sudo apt install default-libmysqlclient-dev

躓いたところ2

上記コードは正常に動くのですが、接続ホストをlocalhostにしていた際のハマりポイントです

sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)") (Background on this error at: http://sqlalche.me/e/e3q8)

というエラーが実行時に出ます。
内容はシンプルで/var/run/mysqld/mysqld.sockに接続に向かった結果失敗してるだけなんですよね。
当然といえば当然で、私が接続したかったMySQLはdocker内にあり、
MySQLが動作してるコンテナの3306ポートとホスト(Ubuntu)の3306ポートを接続しているとはいえ、
当然Ubuntuの/var/run/mysqld/mysqld.sockにはなにもないわけです。

このエラーからわかることは、SQLAlchemy(正確にはmysqlclient or libmysqlclientだと思いますが)の
セッション作成時にlocalhostを指定するとlocalhostにTCPのセッションは張らない、ということです。
逆に127.0.0.1を指定したら普通にTCPセッション貼るのか。。。という。。。
docker上にMySQLを立てる場合の知見としてまたひとつ賢くなったのでした。

といった流れでUbuntu+MySQL(docker)でSQLAlchemyを実行できました!
docker上のmysqlの永続化などに関しては他の方がいろいろと書いているので、調べてみてください。

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?