データベースを使ったサイトを作りたい⑦ PythonでMariaDBへデータ更新|準備編

スポンサーリンク
スポンサーリンク

MariaDB Connector/Python

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

Python to MariaDB Connector | MariaDB
You can use the popular programming language Python to manage data stored in MariaDB. Here is everything you need to know about connecting to MariaDB from Pytho...
mariadb
Python MariaDB extension
MariaDB Connector/Python — MariaDB Connector/Python 1.0.0 documentation
スポンサーリンク

準備

$ 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をアップデート

Upgrading from MariaDB 5.5 to MariaDB 10.0
How to upgrade from MariaDB 5.5 to MariaDB 10.0.
CentOS7のMariaDB5.5を10.3にアップグレードする - Qiita
※10.3 stable リリースされてるので更新してみた。 MySql5.6+からマイグレーションする場合など、MariaDB5.5では動作しないケースが多々ありそうなので10.1「10.3」にしてみました。 公式yumリポジ...
MariaDB Package Repository Setup and Usage
Executing and using a convenient shell script to set up the MariaDB Package Repository.
$ 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

Python MariaDB pip install failed, missing mariadb_config - Stack Overflow
mariadb-corporation/mariadb-connector-c
MariaDB Connector/C is used to connect applications developed in C/C++ to MariaDB and MySQL databases.The client library is LGPL licensed. - mariadb-corporatio...
gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39)

gccバージョン確認

$ yum install cmake

cmakeインストール

yum install curl

curlインストール

ん?これってソースからビルドする感じ?やべぇ分からん。

Installing Connector C for Mariadb - Stack Overflow
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)

ちょっと進んだ!けど、またエラーだ…。これはちょっと置いといて、さっきのパスの通し方は一時的なものらしい。ので永続的に設定する。

CentOS7でldconfigを使って共有ライブラリを追加する - Qiita
概要 CentOS7では、デフォルトで/libと/usr/lib以下のファイルは、共有ライブラリとして含まれています。 それ以外のディレクトリのライブラリを追加したい場合は、以下のいずれかの方法で設定する必要があります。 特...

ここ見ながら

$ 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)

なんか

「Can't connect to local MySQL server through socket」エラーについて

ソケットが無い。もしくはpythonが使おうとしてるソケットとDBが使ってるソケットが一致してない。みたいな。MariaDBが使ってるソケットを調べる。

$ mariadb_config --socket
/tmp/mysql.sock

えー、そうなの?んーDBが使ってるソケットを変更するのはなんか怖いな。ちょっと調べると

Can't connect to local MySQL server through socket '/tmp/mysql.sock
When I attempted to connect to a local MySQL server during my test suite, it fails with the error: OperationalError: (2002, "Can't connect to local MySQL serve...

ここに

  • 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を編集して使用するソケットを変えたりとか、なんか色々あるみたいよ。

なんか疲れたし使えるようになったのは分かったからまた今度にしよう。

コメント

タイトルとURLをコピーしました