MariaDB Connector/Python
スクレイピングでPythonを使ったので、そのまま取得したデータをDBに更新したいなーと思った。探したらライブラリがあるみたい。なんか日本語の情報が少ない気がするけどなんでだろ。


準備
$ pip install mariadb
でインストール…エラー出た。
ERROR: Command errored out with exit status 1:
command: /usr/local/bin/python3.8 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-e_qwrg9i/mariadb/setup.py'"'"'; __file__='"'"'/tmp/pip-install-e_qwrg9i/mariadb/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-pe46t1ak
cwd: /tmp/pip-install-e_qwrg9i/mariadb/
Complete output (12 lines):
/bin/sh: mariadb_config: command not found
Traceback (most recent call last):
File "", line 1, in
File "/tmp/pip-install-e_qwrg9i/mariadb/setup.py", line 26, in
cfg = get_config(options)
File "/tmp/pip-install-e_qwrg9i/mariadb/mariadb_posix.py", line 51, in get_config
cc_version = mariadb_config(config_prg, "cc_version")
File "/tmp/pip-install-e_qwrg9i/mariadb/mariadb_posix.py", line 28, in mariadb_config
raise EnvironmentError(
OSError: mariadb_config not found.
Please make sure, that MariaDB Connector/C is installed on your system, edit the configuration file 'site.cfg' and set the 'mariadb_config'
option, which should point to the mariadb_config utility.
----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
mariadb_configが無い?こっからいろいろ調べたけど何が効いたか分からん。
MariaDBをアップデート

$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
[info] Repository file successfully written to /etc/yum.repos.d/mariadb.repo
[info] Adding trusted package signing keys...
[info] Successfully added trusted package signing keys
リポジトリを登録。
$ sudo systemctl stop mariadb
$ sudo yum update mariadb-server
止めてアプデ。
$ sudo yum remove MariaDB-server
なんかこれやってからの方がいいらしいがやってない。
$ sudo systemctl start mariadb
起動
$ mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.5.5-MariaDB MariaDB Server
できたっぽい。5.5→10.5になった。
mariadb-connector-c

gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39)
gccバージョン確認
$ yum install cmake
cmakeインストール
yum install curl
curlインストール
ん?これってソースからビルドする感じ?やべぇ分からん。

sudo yum install MariaDB-devel
こっち。でも色々やったけどerror: command ‘gcc’ failed with exit status 1ていうのが出て結局pip3 install mariadbでインストールできん。
同じページの
sudo yum -y install git gcc openssl-devel make cmake
git clone https://github.com/MariaDB/mariadb-connector-c.git
mkdir build && cd build
cmake ../mariadb-connector-c/ -DCMAKE_INSTALL_PREFIX=/usr
make
sudo make install
一行ずつやる。でもっかい
pip3 install mariadb
Collecting mariadb
Using cached mariadb-1.0.1.tar.gz (65 kB)
Using legacy 'setup.py install' for mariadb, since package 'wheel' is not installed.
Installing collected packages: mariadb
Running setup.py install for mariadb ... done
Successfully installed mariadb-1.0.1
いけた…?
試す
create database test;
でデータベースを作っとく。Basic usageにある
# Import MariaDB Connector/Python module
import mariadb
# Establish a connection
connection= mariadb.connect(user="myuser", database="test", host="localhost")
cursor= connection.cursor()
# Create a database table
cursor.execute("DROP TABLE IF EXISTS mytest")
cursor.execute("CREATE TABLE mytest(id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,"
"first_name VARCHAR(100), last_name VARCHAR(100))")
# Populate table with some data
cursor.execute("INSERT INTO mytest(first_name, last_name) VALUES (?,?)",
("Robert", "Redford"))
# retrieve data
cursor.execute("SELECT id, first_name, last_name FROM mytest")
# print content
row= cursor.fetchone()
print(*row, sep='\t')
# free resources
cursor.close()
connection.close()
だけど、
#ここに connection= mariadb.connect(user="myuser", database="test", host="localhost")
#パスワード入れたconnection= mariadb.connect(user="myuser",password="password", database="test", host="localhost")
じゃー実行
python3 dbtest.py
Traceback (most recent call last):
File "dbtest.py", line 2, in
import mariadb
File "/usr/local/lib/python3.8/site-packages/mariadb/__init__.py", line 7, in
from ._mariadb import (
ImportError: libmariadb.so.3: cannot open shared object file: No such file or directory
またエラーかよおおおお…。疲れてきちゃった…。どうやらパスが通ってないために起きるエラーらしい。
ImportError: libmariadb.so.3: cannot open shared object file: No such file or directory
$ sudo find / -name libmariadb.so.3
/root/build/libmariadb/libmariadb.so.3
/usr/lib/mariadb/libmariadb.so.3
探すと見つかる。
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/mariadb
こう。でもっかい
$ python3 /home/dalomo/shogi/dbtest.py
結果
Traceback (most recent call last):
File "/home/dalomo/shogi/dbtest.py", line 5, in
connection= mariadb.connect(user="",password="", database="test", host="localhost")
mariadb.OperationalError: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
ちょっと進んだ!けど、またエラーだ…。これはちょっと置いといて、さっきのパスの通し方は一時的なものらしい。ので永続的に設定する。

ここ見ながら
$ ldconfig -p | grep maria
libmariadbd.so.19 (libc6,x86-64) => /lib64/libmariadbd.so.19
libmariadbd.so (libc6,x86-64) => /lib64/libmariadbd.so
確認してみたけど無い。そしたら
$ vi /etc/ld.so.conf.d/mariadb-3.1.9.conf
で
/usr/lib/mariadb
を新規に書いて保存。
$ ldconfig
更新して確認してみる。
$ ldconfig -p | grep maria
libmariadbd.so.19 (libc6,x86-64) => /lib64/libmariadbd.so.19
libmariadbd.so (libc6,x86-64) => /lib64/libmariadbd.so
libmariadb.so.3 (libc6,x86-64) => /usr/lib/mariadb/libmariadb.so.3
libmariadb.so (libc6,x86-64) => /usr/lib/mariadb/libmariadb.so
よさげ。
mariadb.OperationalError: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
そしたらこのエラーをどうにかしたい。
mariadb.OperationalError: Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)
なんか
ソケットが無い。もしくはpythonが使おうとしてるソケットとDBが使ってるソケットが一致してない。みたいな。MariaDBが使ってるソケットを調べる。
$ mariadb_config --socket
/tmp/mysql.sock
えー、そうなの?んーDBが使ってるソケットを変更するのはなんか怖いな。ちょっと調べると

ここに
- If host is set to
localhost
, then a socket or pipe is used.- If host is set to
127.0.0.1
, then the client is forced to use TCP/IP.
- ホストが localhost に設定されている場合は、ソケットまたはパイプが使用されます。
- ホストが 127.0.0.0.1 に設定されている場合、クライアントは強制的に TCP/IP を使用します。
ほーほう。もしかしたら
connection= mariadb.connect(user="", password="", database="test", host="127.0.0.1")
こうしてみると?
$ python3 /home/dalomo/shogi/dbtest.py
1 Robert Redford
おおおおおおおおおおおおおおおおお!!!!!!!!!!!!!!!!!!!!!!!!!!!
できた!!!!!!!!!!!!!!!!!!!!!!!!!!!
あーでも、ソケット使うのとTCP/IP使うのとどっちがどう違うんだろ。ソケット使うほうがサーバー内から直で行ってる感があって、TCP/IPだとネットワーク経由してそうなイメージ(分かってない)。やっぱソケット経由で行ける方法を採用したほうがいいんかな…。でもな…せっかく動いたしな…
…
いっか。まぁ後学のために、/tmp/mysql.sockを作って所有権を変更したり、/etc/my.cnfを編集して使用するソケットを変えたりとか、なんか色々あるみたいよ。
なんか疲れたし使えるようになったのは分かったからまた今度にしよう。
コメント