如果我的MySQL Socket不在/tmp,能否在SqlAlchemy和Flask中使用MySQL?

21 投票
3 回答
12561 浏览
提问于 2025-04-16 19:00

我系统中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

我有几个问题:

  1. sqlalchemy是怎么知道/tmp/mysql.sock是正确位置的?
  2. 有没有办法通过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的地址。

撰写回答