MacでローカルのMySQL5.6にPython3.4で接続する際にlibmysqlclient.18.dylibが無いとエラーが出た

2015-05-10
このエントリーをはてなブックマークに追加

mysqlclient使って

import MySQLdb

しただけで

Library not loaded: libmysqlclient.18.dylib

ってエラー吐いたんだけどlibmysqlclient.18.dylibは

/usr/local/mysql-5.6.16-osx10.7-x86_64/lib/libmysqlclient.18.dylib

にありました。なので、

sudo ln -s /usr/local/mysql-5.6.16-osx10.7-x86_64/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

シンボリックリンク張って無事に繋がるようになりました。

久々にローカルで作業するとつまんないことで躓く。。。

Python3.4でMySQLに接続してDjangoでも使ってみる

2014-09-18
このエントリーをはてなブックマークに追加

MySQLドライバはどれを使えばいいのかはっきりわからない、というのがPython3に本格的に踏み込めないでいた一番の理由がだったわけですが、MySQL Connector/PythonがPython3をサポートしててDjangoでも使えてマルチバイト文字もちゃんと通るっぽかったので試してみました。

unzip mysql-connector-python-1.2.3.zip
cd mysql-connector-python-1.2.3
python setup.py install
pip freeze

インストールはこれだけ。
DB-API 2.0準拠らしいので触り方も変わらずに安心。こういうのがPythonのいいところじゃないかと。

import mysql.connector


def main():

    _conn = mysql.connector.connect(
            user='USERNAME',
            password='PASSWD',
            host='127.0.0.1',
            database='DBNAME')

    _cur = _conn.cursor()
    _cur.execute("select * from app_comment;")
    for _row in _cur.fetchall():
        print(_row[0])

    _cur.close()
    _conn.close()

if __name__ == '__main__':
    main()

DjangoからMySQLを使うときはこれで。

DATABASES = {
    'default': {
        'NAME': 'DBNAME',
        'ENGINE': 'mysql.connector.django',
        'USER': 'USERNAME',
        'PASSWORD': 'PASSWD',
    }
}

マルチバイト文字使ってもinsert,update、selectひと通り問題なさ気だったので試しになんか書いてみようと思いました。

あ、Djangoは1.7で試してます。

golangでMySQLに接続

2014-07-18
このエントリーをはてなブックマークに追加

新しい言語の勉強始めたら最初は掲示板を作る、っていうのが自分のなかでパターン化してるのでそれに向けてまずはgolangからMySQLにつないでみた。ORM使えばこのへんは意識しないでいいんだろうけど、まあ触っておいて損はしないでしょ。

ドライバはgo-sql-driver/mysql使いました。インストールは

go get github.com/go-sql-driver/mysql

だけ。GOPATHが通ってないとめんどくさい。最初それでそこそこの時間溶かした。

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"os"
)

func main() {

	var pub_date string
	var mod_date string

	db, err := sql.Open("mysql", "user:passwd@/some_db")
	if err != nil {
		os.Exit(1)
	}

	rows, err := db.Query("select pub_date, mod_date from some_table;")
	if err != nil {
		fmt.Println("ERROR")
		os.Exit(1)
	}

	for rows.Next() {
		rows.Scan(&pub_date, &mod_date)
		fmt.Println(pub_date, mod_date)
	}
}

取ってきたフィールドが日付型なのは特に意味は無いです。golangには日付型が見当たらなかったのでどうなんのかなー、って。rowは構造体にしてそれを内包したmapを返却するようにしてラップすればいいのかな。

Tags: ,

MySQLで最後に発行されたAUTO INCREMENTの値を変数に代入

2012-05-11
このエントリーをはてなブックマークに追加

MySQLにバッチファイルとかでデータ投入していく時、リレーションを張っている場合は子のテーブルには親テーブルのpkが必要になります。fkの値ですよね。

親テーブルにinsert、新たに発行されたpkの値を変数にいれて、そのまま続けて子テーブルにもinsertしていくサンプル。

久々に書こうとして「あれ?どうやって書いたっけ」って悩んでしまったのでメモしておこう。

insert into oya(body) values(‘hogehoge’);
SET @oya_id = (select last_insert_id() from oya);
insert into ko(oya_id, body) values(@oya_id, ‘ko-hogehoge’);

last_insert_id()ってMySQLだけかも。PostgreSQLとかは確か違う取得の仕方だったと。あ、もちろん各テーブルのpkになるidというカラムはAUTO INCREMENTです。

これを

mysql -u ユーザ名 DB名 < 上記クエリが書かれたファイルへのパス

って実行してやればOKかと。

ちなみにこんなテーブルです。

CREATE TABLE oya(
id int(11) unsigned NOT NULL AUTO_INCREMENT,
body varchar(255) NOT NULL DEFAULT ”,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT DEFAULT CHARSET=utf8;

CREATE TABLE ko(
id int(11) unsigned NOT NULL AUTO_INCREMENT,
oya_id int(11) unsigned NOT NULL,
body varchar(255) NOT NULL DEFAULT ”,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT DEFAULT CHARSET=utf8;

Tags: ,

CentOS5.7にMySQL5.5とMySQL-pythonをインストールしたらエラーが出た

2011-11-07
このエントリーをはてなブックマークに追加

もうまんま表題の通りです。ちょっと遊べる環境作っておこうと思ってCentOS5.7のVM作って、そこにMySQL5.5をソースからビルドしてインストールした時の話です。

まぁエラーが出てプチハマりしたってだけの話ですが。

MySQLのインストールは問題なく終わり、コマンドラインでMySQLへのログインも問題なく終わりました。そこへPython2.7のインストールも無事に終わり、あとはモジュールを入れていくだけ、という状況でMySQL-pythonをインストールしたあとのことです。

Pythonを起動して「import MySQLdb」と叩くと、

ImportError: libmysqlclient.so.18: cannot open shared object file: No such file or directory

とのエラーメッセージ。先週CentOS5.6で環境作ったときには出なかったエラーメッセージです。

まぁただ単に共有ライブラリとして見える場所においていなかっただけの話だったのです。

ので、

/etc/ld.so.conf

/usr/local/mysql/lib

を追記して、

/sbin/ldconfig

要するに置いてある場所も共有ライブラリ置き場として追加してやって設定反映で終わり。すでに共有ライブラリ置き場になっているところにシンボリックリンクを置いてあげてもよかったのかもしれませんが、ライブラリからの相対パス云々があると悲しいことになりそうだったのでパス追加にしておきました。

ハセテツが無知なだけで、シンボリックリンク追加だけでよかったのかもしれません。お好きな方法をお試しいただければ。

MySQLのwhere句で正規表現を使う

2010-09-09
このエントリーをはてなブックマークに追加

できるんだろうと思いつつ、実際使ったことはありませんでした。今回必要に迫られて(まぁ使わなくてもなんとかなったのですが)調べてみたら期待以上に簡単で、非常に便利だったのでメモ。

SELECT * FROM TBL_HOGE WHERE ITEM_CODE REGEXP ‘[a-zA-Z]{1,}-[0-9]{1,4}’

条件の部分はフツーの正規表現です。細かい点に関してはきちんと調べきっていないのですが、期待した結果は得られました。同じような抽出条件の場合、Like検索と正規表現でのパターンマッチ、どっちが速いんでしょうね。

MySQL5.0、CentOS5.2での動作確認です。

Tags:

DjangoでDatetimeのフィールドを年月でGroupByして集計する方法

2010-07-29
このエントリーをはてなブックマークに追加

以前のエントリーで集計クエリを利用する方法を説明しましたが、それだとDatetimeのフィールドを「年月」ごとに、っていう集計はできませんでした。購買履歴データを月別に件数集計したいときなんかは非常に困るんですよね。ので、それを解決する方法です。

select_column = {“d_column”:  “DATE_FORMAT(pub_date, ‘%%Y%%m’)”}
_list = PurchaseRecord.objects.extra(select=select_column)
_list = _list.values(“d_column”).annotate(cnt=Count(‘id’))

上記はMySQLを利用しているケースの書き方です。

あ、横長になると見難いから2行に分けただけで、1行で大丈夫ですからね。

「ORマッパー使ってるのにデータベースに依存ってなによ」

な感じではありますが、extraを使っている部分は直接クエリが流れるみたいですね。
つまり、「DATE_FORMAT(pub_date, ‘%%Y%%m’)」の部分は

select *,DATE_FORMAT(pub_date, ‘%Y%m’) as d_column
from app_purchaserecord

といった風に、追加されるのです。で、追加されたカラムを使って集計、という流れですね。うっかりミスりやすいのが「%」を二つにする点でしょうか。

あと、データベースを変えたら「select_column~」の部分に修正が必要です。使用するデータベースに依存した書き方になります。ここは要注意ですね。

DjangoでMySQLのストレージエンジンをInnoDBにする

2010-07-27
このエントリーをはてなブックマークに追加

DjangoでMySQLを利用する場合、初期状態だとMyISAMでテーブルが作成されます。まぁ後からalterすればよい話ではあるのですが、なんかそれだと違うかなぁと。

一昔前はInnoDBはMyISAMほどパフォーマンスが優れず、更新系のテーブルと参照系のテーブルでストレージエンジンを使い分けたものですが、今はストレージエンジンによるパフォーマンスの差も少ないため、行レベルロックができるInnoDBを積極的に採用するケースが増えてるみたいですね。まぁ数千万行をレコードから数ミリ秒でレスポンスを返さないといけないケースとかではどうなるのかわかりませんが。

DATABASE_OPTIONS = {
“init_command”: “SET storage_engine=INNODB”,
}

settings.pyに上記を記載するだけでsyncdbするときにInnoDBでテーブル作成してくれます。が、この記述はテーブル作成が終わって運用にはいったら削除するように、とのことです。

MySQLとの接続が確立された後にわざわざストレージエンジンを指定するコマンドを送っているっぽいので、普段は無駄な処理が発生しちゃうっていうことなんですかね。

WordPressのチューニングをしてみようかと思った

2009-12-30
このエントリーをはてなブックマークに追加

ApacheBenchでこのブログのパフォーマンスを計測したら、

Requests per second:    9.94[#/sec]

という、思っていたより残念な結果でした。うーん、思っていたより低いなぁ。。。

で、とりあえずmysql_connectをmysql_pconnectに変えてみたのですが。

Requests per second:    10.01 [#/sec]

と、大して変わらず。。。

めんどくさいけど、ApacheとMySQLの設定から見直そう。PHPをDSOで使ってるのも影響してるのかなぁ。。。

MySQLで日付の差分を取得する

2009-09-18
このエントリーをはてなブックマークに追加

timestampdiff(day, from_date, till_date)

これだけです。
第一引数は「month」、「year」で月、年の差も取れます。第二第三引数はtimestampじゃなくてもいいです。まぁTime型だとダメなんだろうけど、Date型だったらちゃんと差分が取得できました。

「登録から~日の情報」みたいな取得の仕方をすることが多いので、こういう関数は使用頻度が高いです。

Tags: