使用flask_sqlalchemy连接mysql数据库时,报了很长一串错误,通过百度和自己倒腾,终于解决了这个问题。
首先,来看看代码:
# import pymysql
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# pymysql.version_info = (1, 4, 13, "final", 0)
# pymysql.install_as_MySQLdb()
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:123456@localhost:3306/flask_test'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), nullable=False)
报了如下错误:
ImportError: dlopen(/Users/lhy/PycharmProjects/flask Project/venv/lib/python3.6/site-packages/MySQLdb/_mysql.cpython-36m-darwin.so, 2): Library not loaded: @rpath/libmysqlclient.21.dylib Referenced from: /Users/llhy/PycharmProjects/flaskProject/venv/lib/python3.6/site-packages/MySQLdb/_mysql.cpython-36m-darwin.so Reason: image not found
通过百度之后,知道是libmysqlclient.21.dylib文件没有导入的原因造成的问题。因此,需要对其进行软连接到系统库中。如下:
sudo ln -s /usr/local/mysql/lib/libmysqlclient.21.dylib /usr/lib/libmysqlclient.21.dylib
并不顺利,报了第一个错误,即:
ln:/usr/lib/libmysqlclient.21.dylib:operation not permitted
这是因为我的mac升级之后开启了SIP(System Integrity Protection),增加了rootless机制,导致即使在root权限下依然无法修改文件,在必要时候为了能够修改下面的文件,我们只能关闭该保护机制(https://www.macdo.cn/21918.html)。
1)重启,过程中按住 command+R,进入保护模式
2)打开terminal终端,输入
csrutil disable
3)再次重启,即可对 usr/bin 目录下文件进行修改
PS:如果要恢复保护机制,重新进入保护模式,输入
csrutil enable
成功之后,再次运行:
sudo ln -s /usr/local/mysql/lib/libmysqlclient.21.dylib /usr/lib/libmysqlclient.21.dylib
又再次遇上了问题:
ln: /usr/lib/libmysqlclient.21.dylib: Read-only file system
感觉还是不行创建/usr/lib/libmysqlclient.21.dylib的软连接,怎么办呢?我们还可以通过创建/usr/local/lib/libmysqlclient.21.dylib软连接来解决这个问题。
sudo ln -s /usr/local/mysql/lib/libmysqlclient.21.dylib /usr/local/lib/libmysqlclient.21.dylib
最终,通过:
from flask_sql.app import db
db.create_all()
在flask_test数据库中成功创建了user表。