SQLAlchemy访问MySQL:ModuleNotFoundError: No module named 'MySQLdb'

JupyterLab使用SQLAlchemy访问MySQL时出现以下错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
Cell In[7], line 2
1 from sqlalchemy import create_engine
----> 2 engine = create_engine("mysql://scrat:scrat%40123@127.0.0.1/scrat")

File <string>:2, in create_engine(url, **kwargs)

File ~/frin/python/venvs/jupyter/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py:281, in deprecated_params.<locals>.decorate.<locals>.warned(fn, *args, **kwargs)
274 if m in kwargs:
275 _warn_with_version(
276 messages[m],
277 versions[m],
278 version_warnings[m],
279 stacklevel=3,
280 )
--> 281 return fn(*args, **kwargs)

File ~/frin/python/venvs/jupyter/lib/python3.12/site-packages/sqlalchemy/engine/create.py:599, in create_engine(url, **kwargs)
597 if k in kwargs:
598 dbapi_args[k] = pop_kwarg(k)
--> 599 dbapi = dbapi_meth(**dbapi_args)
601 dialect_args["dbapi"] = dbapi
603 dialect_args.setdefault("compiler_linting", compiler.NO_LINTING)

File ~/frin/python/venvs/jupyter/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mysqldb.py:147, in MySQLDialect_mysqldb.import_dbapi(cls)
145 @classmethod
146 def import_dbapi(cls):
--> 147 return __import__("MySQLdb")

ModuleNotFoundError: No module named 'MySQLdb'

这是因为SQLAlchemy连接MySQL默认驱动是MySQLdb,MySQLdb仅支持Python2,不支持Python3。如果使用Python3,可以安装pymysql库,并将连接串改为mysql+pymysql://scrat:scrat%40123@127.0.0.1/scrat就好了。