如果我的MySQL Socket不在/tmp,能否在SqlAlchemy和Flask中使用MySQL?
我系统中mysql.sock的位置是 /usr/local/mysql5/mysqld.sock
thrilllap-2:tmp reuven$ mysqld --print-defaults
mysqld would have been started with the following arguments:
--socket=/usr/local/mysql5/mysqld.sock --port=3306
当我尝试通过flask使用sqlalchemy连接mysql时,我遇到了:
File "build/bdist.macosx-10.6-intel/egg/MySQLdb/connections.py", line 187, in __init__
sqlalchemy.exc.OperationalError: (OperationalError) (2002, "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)") None None
mysql程序可以正常连接到数据库,我系统上的其他mysql客户端也都能连接。
我的my.cnf文件里有正确的socket位置
[client]
port = 3306
socket = /usr/local/mysql5/mysqld.sock
[safe_mysqld]
socket = /usr/local/mysql5/mysqld.sock
[mysqld_safe]
socket = /usr/local/mysql5/mysqld.sock
[mysqld]
socket = /usr/local/mysql5/mysqld.sock
port = 3306
基础的"SQLAlchemy"库有一个选项,可以让你指定mysql.sock的位置,但这个选项在sqlalchemy / flask库中并没有暴露出来
http://packages.python.org/Flask-SQLAlchemy/config.html
我有几个问题:
- sqlalchemy是怎么知道/tmp/mysql.sock是正确位置的?
- 有没有办法通过Flash-SQLAlchemy连接器来改变默认设置?
3 个回答
0
你可以使用以下方式来创建连接:
sqlalchemy.create_engine(
mysql_str = sqlalchemy.engine.url.URL(
drivername='mysql+pymysql',
username="db_user",
password="db_pass",
database=db_name,
query={
'unix_socket': '/usr/local/mysql5/mysqld.sock'
}
)
)
16
没错!Sean说得对。
app.config['SQLALCHEMY_DATABASE_URI'] = ''mysql://dayenu:secret.word@localhost/dayenu?unix_socket=/usr/local/mysql5/mysqld.sock
db = SQLAlchemy(app)
运行得很好!我觉得这个参数是pyodbc用的,而SQLAlchemy就是通过它来和mysql沟通的,不过我在pyodbc的文档里找不到这个参数。
35
你需要查一下具体的写法,但我记得在MySQL中,他们用的是一个叫做 unix_socket
的查询选项。大概是这样的:
mysql:///dbname?unix_socket=/opt/mysql/mysql.sock'
这应该就是你用来连接SQLAlchemy的地址。