QMySql & SqlAlchemy 填坑记录(Mac OS)
零蚀
QMYSQL driver not loaded 问题及解决
没有QMYSQL驱动情况
在使用QMYSQL时候先要知道你的pyqt5是有没有MySql的驱动的,如果连驱动都没有,那做其他的一点用都没效果,花个一天半天在这种问题上是没有意义且打击人的!所以要用以下的代码来查看自己支持哪些数据库,
from PyQt5 import QtSql
print(QtSql.QSqlDatabase.drivers())
当没有QMYSQL 时,死心吧,说明你的版本是不支持QMYSQL的,别问为什么,因为只有pyqt5 5.12.1版本才支持QMYSQL。所以下一个5.12.1吧。(如果想用的其他版本可以试着下一个libqsqlmysql.dylib 放在QT的驱动文件里)
# 卸载本地
pip uninstall pyqt5
pip install pyqt5==5.12.1
# 其中安装网速很慢,所以我试了以下方式,显示加载的也是5.12.1
pip install pyqt5==5.12
通过以上的安装,重新测试,发现终于有了QMYSQL,但是还若是显示driver not loaded。这主要是QT数据库调用的版本问题,版本号对不上,所以出现了问题。
有QMYSQL驱动情况
首先看看自己的QT调用数据库的目标版本,看自己项目里的sql驱动文件夹中mysql驱动的目标版本号:
otool -L /Users/xxxxxx/workspace/python/test/mysqldemo/venv/lib/python3.8/site-packages/PyQt5/Qt/plugins/sqldrivers/libqsqlmysql.dylib
得到的结果是:
libqsqlmysql.dylib (compatibility version 0.0.0, current version 0.0.0)@rpath/QtSql.framework/Versions/5/QtSql (compatibility version 5.12.0, current version 5.12.1)@rpath/QtCore.framework/Versions/5/QtCore (compatibility version 5.12.0, current version 5.12.1)/System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration (compatibility version 1.0.0, current version 1.0.0)/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)/usr/local/mysql/lib/libmysqlclient.20.dylib (compatibility version 20.0.0, current version 20.0.0)/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.4)/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)
其中调用的是/usr/local/mysql/lib/libmysqlclient.20.dylib,为20的mysql数据库版本,但是打开我的mysql其中版本为21(libmysqlclient.21.dylib):
ls /usr/local/mysql-8.0.19-macos10.15-x86_64/lib/libmysqllibmysqlclient.21.dylib* libmysqlclient.dylib@
libmysqlclient.a libmysqlservices.a
所以需要将数据库目标指定为21:
sudo install_name_tool -change /usr/local/mysql/lib/libmysqlclient.20.dylib /usr/local/mysql-8.0.19-macos10.15-x86_64/lib/libmysqlclient.21.dylib /Users/xxxx/workspace/python/test/mysqldemo/venv/lib/python3.8/site-packages/PyQt5/Qt/pluginotool -L /Users/xxxx/workspace/python/test/mysqldemo/venv/lib/python3.8/site-packages/PyQt5/Qt/plugins/sqldrivers/libqsqlmysql.dylib
这里-change 后第一个参数是old lib,第二个参数是现在重新指定的 new lib ,这都没问题,最后第三个参数是项目里面指定mysql的lib。整体是将old转换为new 注入项目的指定mysql 的lib中。
网上就没找到一个写的全的,找资料也特琐碎,所以总结一下(人生苦短,用pyqt更短)
SqlAlchemy No module named ‘MySQLdb’
-
查问题所在
缺少 MySQLdb 这个模块,既然缺少模块,检查一下自己的pycharm,是否安装了project,我们可以利用pymysql作为中间桥梁连接mysql。
pip install pymysql
将数据库连接改为 mysql+pymysql://username:password@localhost:3306/db,接下来的操作就一切正常了。
-
密码问题
untimeError: cryptography is required for sha256_password or caching_sha2_password
主要问题是mysql运用sha256签名的密码,而python没有这个需要安装插件
pip install cryptography
? NO.7 Python操作MySQL