« Authentication with old (insecure) passwords is not supported. For more information, lookup Password Hashing in the latest MySQL manual | トップページ | PythonでKInterbasDBを使ってFirebirdデータベースに接続してみる »

2014-08-30

pythonでMySQL Connectorを使ってデータベースに接続してみる

MySQLに接続してみました。

MySQL connector/Pythonのダウンロード

まずはMySQLのサイトからPython用のコネクターをダウンロードします。

MySQL connector/Pythonのインストール

Windows版はWindowsインストーラで配布されているので、インストーラでインストールするだけだと思います。私は古いLinuxにインストールしたかったのですが、Ubuntu, Debian, SUSE, Red Hatのどのディストリビューションでもないので、Platform Independentを選択してtar.gz形式からインストールしました。

tar xzvf mysql-connector-python-1.0.12.tar.gz
cd mysql-connector-python-1.0.12/mysql-connector-python-1.0.12
python setup.py install

という感じでtarファイルを展開して、setup.pyファイルをinstallパラメータ付きで実行してインストールしました。ファイル/フォルダ名のバージョン番号は利用するバージョンによって変わってくると思います。私の環境ではpythonのバージョンが2.4なので敢えて古いバージョンを選択しました。
Windowsにはpython2.7をインストールしてコネクターは1.2.3をインストーラでインストールしました。

WindowsやUbuntuで利用するなら特に悩むこともなくインストールできるのだと思います。

接続テスト

さっそく、キチンとインストールできたのか、MySQLにアクセスできるかをテストしてみました。

古いLinux機でやったため、システムもデータベースも文字コードがEUC-JPなので文字コードに関する処理の部分が最近の一般的なシステムとはちょっと違ってると思いますので、適宜UTF-8やUnicodeでの処理に置き換えて下さい。

# -*- coding: euc-jp -*-

import site
import mysql.connector

def test_con():
    connect = mysql.connector.connect(user='root', 
                                          password='passwd', 
                                          host = '127.0.0.1', 
                                          database='TestDB', 
                                          charset='ujis')
    cursor = connect.cursor()
    cursor.execute('SELECT ID, TITLE FROM TEST_TBL ORDER BY ID DESC LIMIT 5')
    rows = cursor.fetchall()
    for (id, title) in rows:
        print '%d\t%s' % (id, unicode(title))
    cursor.close()
    connect.close()

if __name__ == "__main__":
    test_con()

14行目のrowsにはタプルが格納されたリストとして返されるようで、リストの1要素が1レコードで、タプルの1要素が1フィールドに対応しているようです。

レコードの内容をディクショナリで取得する

調べてみたら、どうやらMySQL connectorのDevelopment Releasesとなるバージョン2.0.0からはコネクターからカーソルを取得する時にdictionary=Trueとする事でディクショナリのリストとして結果を取得できるようです。

    connect = mysql.connector.connect(user='root', 
                                          password='passwd', 
                                          host = '127.0.0.1', 
                                          database='TestDB', 
                                          charset='ujis')
    cursor = connect.cursor(dictionary = True)
    cursor.execute('SELECT ID, TITLE FROM TEST_TBL ORDER BY ID DESC LIMIT 5')
    rows = cursor.fetchall()
    for fields in rows:
        print '%d\t%s' % (fields["ID"], unicode(fields["TITLE"]))
    cursor.close()
    connect.close()

こんな感じになるんでしょうかね。試してませんのであしからず。

フィールド名と値のディクショナリになってると、SQLの内容やフィールドの順序を知らなくても、フィールド名で値にアクセスできるので便利です。

MySQL for Python

今回テストしたモジュールではないMySQL接続モジュールです。もしかするとこちらのモジュールを使われている方の方が多いのかな。

MySQL for Python ( http://sourceforge.net/projects/mysql-python/ )


|

« Authentication with old (insecure) passwords is not supported. For more information, lookup Password Hashing in the latest MySQL manual | トップページ | PythonでKInterbasDBを使ってFirebirdデータベースに接続してみる »

python」カテゴリの記事

コメント

kasaburankaさん

MySQLサーバーの方の問題のように思えるのですが…。
ローカルホストのMySQLサーバーに接続できないというエラーのようですが?
MySQLの設定はされていますか?
localhostからのusernameがtestデータベースにアクセスできるように設定はされていますか?

投稿: TagoSuck | 2017-02-16 06:23

こんにちは!
お教えください。下記のようなコードを書くとエラーが発生します。
Windows10使用しています

Import MySQLdb
Connection = Mysql.connect(
host=”localhost”,
port=3306,
db=”test”,
user=”username”,
passwd=”password”,
)
cursor = connection.cursor()
cursor.execute(‘’’CREAT TABLE products (name text, price integer);’’’)
cursor.execute(‘’’INSERT INTO products (name, price)VALUES (‘apple’, 198);’’’)
cursor.execute(‘’’INSERT INTO products (name, price)VALUES (‘orange’, 100);’’’)
connection.commit()
cursor.execute(‘’’SELECT * FROM products:’’’)
products = cursor.fetchall()
print(products) # -> ((‘apple’, 198L), (‘orange’, 100L))

****************************************************************************************
mport MySQLdb
connection = MySQLdb.connect(
... host="localhost",
... port=3306,
... db="test",
... user="username",
... passwd="password",
...
...
... )
Traceback (most recent call last):
File "", line 6, in
File "C:\python27\lib\site-packages\MySQLdb\init.py", line 81, in Connect
return Connection(*args, kwargs) →どのような意味になりますか?
File "C:\python27\lib\site-packages\MySQLdb\connections.py", line 187, in init
super(Connection, self).init(*args, kwargs2) →どのような意味になりますか?
_mysql_exceptions.OperationalError: (2003, "Can't connect to MySQL server on 'localhost' (10061)")
   →どのような意味になりますか?

Python2.7.12 32BitからMySQLはインストールしました。
上記のスクリプトを実行するには事前に何かの設定が必要になると思いますが
インストールしてimportしてコードをたたくとエラーになります

お教えいただけませんか?
よろしくお願いいたします。

投稿: kasaburanka | 2017-02-14 12:47

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: pythonでMySQL Connectorを使ってデータベースに接続してみる:

« Authentication with old (insecure) passwords is not supported. For more information, lookup Password Hashing in the latest MySQL manual | トップページ | PythonでKInterbasDBを使ってFirebirdデータベースに接続してみる »