sql >> データベース >  >> RDS >> Mysql

Python + SQLAlchemyをリモートで使用してMySQLデータベースに接続するにはどうすればよいですか?

    この問題に対する古典的な答えは、127.0.0.1を使用することです。 またはホストのIP またはホスト名 「特別な名前」の代わりにlocalhostドキュメント から :

    そして後で:

    ただし、この単純なトリックはあなたのケースでは機能しないように思われるため、何らかの方法で強制する必要があります。 TCPソケットの使用。自分で説明したように、mysqlを呼び出すとき コマンドラインでは、--protocol tcpを使用します オプション。

    説明したように、ここ 、SQLAlchemyから、関連するオプション(存在する場合)をURLオプションまたはとしてドライバーに渡すことができます。 connect_argsを使用する キーワード引数。

    たとえば、 PyMySQLを使用します 、その目的のためにセットアップしたテストシステム(MariaDB 10.0.12、SQLAlchemy 0.9.8、およびPyMySQL 0.6.2)で、次の結果が得られました。

    >>> engine = create_engine(
          "mysql+pymysql://sylvain:[email protected]/db?host=localhost?port=3306")
    #                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^
    #                               Force TCP socket. Notice the two uses of `?`
    #                               Normally URL options should use `?` and `&`  
    #                               after that. But that doesn't work here (bug?)
    >>> conn = engine.connect()
    >>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
    [('localhost:54164',)]
    
    # Same result by using 127.0.0.1 instead of localhost: 
    >>> engine = create_engine(
          "mysql+pymysql://sylvain:[email protected]/db?host=localhost?port=3306")
    >>> conn = engine.connect()
    >>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
    [('localhost:54164',)]
    
    # Alternatively, using connect_args:
    >>> engine = create_engine("mysql+pymysql://sylvain:[email protected]/db",
                           connect_args= dict(host='localhost', port=3306))
    >>> conn = engine.connect()
    >>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
    [('localhost:54353',)]
    

    お気づきのように、どちらもTCP接続を使用します(ホスト名の後のポート番号のためにわかります)。一方:

    >>> engine = create_engine(
          "mysql+pymysql://sylvain:[email protected]/db?unix_socket=/path/to/mysql.sock")
    #                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    #                               Specify the path to mysql.sock in
    #                               the `unix_socket` option will force
    #                               usage of a UNIX socket
    
    >>> conn = engine.connect()
    >>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
    [('localhost',)]
    
    # Same result by using 127.0.0.1 instead of localhost: 
    >>> engine = create_engine(
          "mysql+pymysql://sylvain:[email protected]/db?unix_socket=/path/to/mysql.sock")
    >>> conn = engine.connect()
    >>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
    [('localhost',)]
    
    # Alternatively, using connect_args:
    >>> engine = create_engine("mysql+pymysql://sylvain:[email protected]/db",
                           connect_args= dict(unix_socket="/path/to/mysql.sock"))
    >>> conn = engine.connect()
    >>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
    [('localhost',)]
    

    ホスト名の後にポートがありません :これはUNIXソケットです。



    1. DEFAULT句にCURRENT_TIMESTAMPを持つTIMESTAMP列が1つしかないのはなぜですか?

    2. CodeIgniterを使用して3つのテーブルを内部結合する方法

    3. 破損したxampp'mysql.user'テーブルをどのように修復しますか?

    4. java.lang.AbstractMethodError:com.mysql.jdbc.Connection.isValid(I)Z