環境
- 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の永続化などに関しては他の方がいろいろと書いているので、調べてみてください。