20210603のMySQLに関する記事は7件です。

MySQL からヘッダ付 CSV ファイルをエクスポートする

MySQL から CSV ファイルを取得するには、通常は SELECT * FROM tablename INTO OUTFILE filename; のようにする。 しかし以下のようにするにはどうしたらいいかな? カラム名をヘッダ行として CSV ファイルの1行目に追加したい スクリプトで行いたい FILE権限の無い MySQL ユーザを使いたい ということで、python で SELECT 構文を実行し、python 実行ユーザ権限でファイルに書き込む方法を考えた。 import pymysql.cursors import csv db=pymysql.connect(host="localhost", user="selectuser", password="testpassword" , cursorclass=pymysql.cursors.DictCursor) cursor=db.cursor() cursor.execute("USE test") sql=('SELECT * FROM センサ') cursor.execute(sql) rows=cursor.fetchall() cursor.close() db.close() if rows: columnNames = list() # ヘッダデータを作る for i in cursor.description: columnNames.append(i[0]) with open(テーブル,'w',newline='') as 'test.csv': # 辞書順序を指定しておく csvwriter = csv.DictWriter(csvfile,columnNames,delimiter=",",quotechar='"') # ヘッダ行を書き込み csvwriter.writeheader() for row in rows: # csv データを書き込み csvwriter.writerow(row) 実行 $ python3 export.py 結果 $ cat test.csv id,センサ,温度,湿度,メモ 1,1,22.0,85.0,ストーブON 2,2,17.0,65.0,廊下
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker で MySQL 3306 に接続できなかった

エラー内容 Mac の docker で node を使っていたら、以下のようなエラーが出ました。 (node:1753) UnhandledPromiseRejectionWarning: Error: connect ECONNREFUSED 127.0.0.1:3306 3306 ということでMySQLに接続できていないようなので、dockerの方を見てみる。 すると以下のエラーが出ていました。 [error] --initialize specified but the data directory has files in it. aborting. どうやらファイルが存在していて失敗しているよう。 だがvolumeやめぼしいファイルを消してみたり、ネットを検索して出てきた記事では解決できませんでした。 解決策 結果としては以下で解決しました。 Docker の Menu から Troubleshoot を選択 Clean / Purge data をする Reset to factory defaults をする どっちが効いたのかわからないけどこれで直りました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MariaDB(MySQL)を一般ユーザーでインストールする

UNIX系のオペレーティングシステムは、マルチユーザーで使用されるのが前提で作られたOSであり、ソフトウェアはrootでインストール・実行され、一般ユーザーがそれを使わせていただく、というのが基本的な考え方になっています。 一方で、開発用途でソフトを使いたい、あるいはちょっと動作確認をしたい、といった場合に、いちいち管理ユーザーの権限がないとインストールできないのは不便ですよね。 というか、ちょっとソフトを試したいだけなのにルート権限でシステムをいじるって、ちょっと怖いです。「やっぱ使わないからソフトをアンインストールするわ」って言って本当に元通りに戻せるかとかいろいろ心配ですよね。 そこで、横浜ベイキットではいくつかのソフトウェアについて、一般ユーザーでインストールする方法を紹介していきます。 今回はMariaDB(MySQL)です。 MariaDBを一般ユーザーでインストールするメリット 挙げたらキリがないですが、 管理ユーザー権限がなくても自由に起動・終了ができる 管理者や他のOSユーザーとの調整の必要もなく、自分一人の中で完結するので面倒がないです。 データベースを他人と共有する必要がない 複数のOSユーザーでMariaDBを使う場合は、他人のDBを壊しちゃったりとかしそうで怖いですw 壊したり作り直したりが自由にできる つまりいろいろ好きなように試せるってことですね。DB最初から作り直したいときとか、rootユーザーにならなくても、DBのフォルダをrmするだけなので楽ちんです。rootユーザーでrm -rコマンドとか実行したくないですよねw 設定やログなど、どこにあるか完全にコントロールできる パッケージインストールだと、MySQLを起動した後、ログの場所がどこか分からなくて、やっと分かったとしてもrootユーザー権限じゃないと見られなくていちいちsudoするのとか地味に面倒だったりしません? アンインストールが簡単 それな!アンインストールはディレクトリごと消すだけでOK。 Mac使ったことある人は分かると思いますが、アプリケーションフォルダの中のアプリケーションをごみ箱に入れる感覚で消せますw 管理者でインストールした場合、設定ファイルやDB、ログなどがシステムのディレクトリに残る可能性があり、完全にクリーンな状態に戻せるかよく分からないんですよね。 スキルアップになる 何といっても、一般ユーザーインストールを経験しておくと確実に経験値が上がります。 そういうところが地味におススメではあるのですがw もちろん、管理ユーザーでインストールするメリットもありますよ yumやrpm、aptなどのツール一発で瞬間インストールできる システムに組み込まれるので自動起動の設定などが簡単 というのはありますね。 なので、開発環境なのか、テスト環境なのか、本番環境なのか、と言ったところでも選択は変わりそうです。 と言うのを念頭に、「それでも一般ユーザーでインストーしたい!」という方のために、MariaDB(MySQL)を一般ユーザーでインストールする方法を解説します。 ※ここではCentOS8で解説します。また、MySQLも作業はほとんど同じなので都度読み替えてください。 準備 ここでは、ホームディレクトリの下のapp/mariadb配下にインストールすることにします。 つまり、このディレクトリを消すだけで、全てをなかったことにできるわけw $ mkdir -p ~/app/mariadb 必要なパッケージのインストール MariaDBのコンパイルに必要なツールやパッケージをインストールします。 環境によって違うのでアレですが、とりあえず弊環境ではこのあたりが必要でした make cmake gcc gcc-c++ ncurses-devel gnutls てことでインストール $ sudo yum install -y cmake make gcc gcc-c++ ncurses-devel gnutls-devel ライブラリやツールが足りないとcmakeやmakeに失敗するので、その時出たエラーメッセージからアタリをつけていきます。 例えばcmakeで以下のようなエラーが出ます CMake Error at cmake/readline.cmake:65 (MESSAGE): Curses library not found. Please install appropriate package, remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates it is ncurses-devel. このときはcursesライブラリがないんだということでyum searchします $ yum search curses 出て来た一覧からそれっぽいのを見つけ、「-devel」のついたものをインストールする、という算段です。 (間違ったらyum removeでなかったことにw) MariaDBソースのダウンロード MariaDBのソースを取ってきます。MariaDBのサイト(https://downloads.mariadb.org )からダウンロードしてきます。 今回は10.5.10をDLしました。 $ ls mariadb-10.5.10.tar.gz 解凍して中に入ります。 $ tar zxf mariadb-10.5.10.tar.gz $ ls mariadb-10.5.10 mariadb-10.5.10.tar.gz $ cd mariadb-10.5.10 コンパイルとインストール Makefile作成 Makefileはcmakeで作成します。configureじゃないところとか、ちょっとイケてないっすねw $ cmake . -DCMAKE_INSTALL_PREFIX=$HOME/app/mariadb \ -DMYSQL_DATADIR=$HOME/app/mariadb/mariadata \ -DMYSQL_UNIX_ADDR=$HOME/app/mariadb/var/mariadb.sock \ -DSYSTEMD_PID_DIR=$HOME/app/mariadb/var \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci cmakeにこれらのオプションを指定することで、もろもろ以下のように設定されます 指定するもの 値 インストール先 $HOME/app/mariadb データベースファイルのデフォルトの置き場所 $HOME/app/mariadb/mariadata デフォルトのローカル接続用ソケットファイル $HOME/app/mariadb/var/mariadb.sock PIDファイルのデフォルトの置き場所 $HOME/app/mariadb/var デフォルトのキャラクタセット UTF-8 デフォルトの照合順序 utf8_general_ci 本当は設定ファイルのデフォルトの置き場所も変えられるといいのだけど、これは/etc/my.cnf固定になっており、変えられないみたい。 というわけで、設定ファイルの場所は起動時に指定することになりますね。 cmakeで指定できるオプションは以下を参考に ちなみに、cmakeをやり直すときはCMakeCache.txtを削除してから行った方がいいらしい。知らんけど。 Make cmakeでエラーが出なければmakeします。結構時間かかるw メモリやコアがたくさんあるなら、-j オプションで並列度を指定してビルドすると速い。 $ make -j 8 (こっちの環境ではメモリ不足で落ちたけどw) makeが終了したらインストールします。 $ make install これで、$HOME/app/mariadb 以下にインストールされました。 移動して確認してみましょう $ cd ~/app/mariadb/ $ ls bin include man README-wsrep sql-bench COPYING INSTALL-BINARY mysql-test scripts support-files CREDITS lib README.md share THIRDPARTY デフォルトの設定がどうなっているか一応確認します。 $ bin/mariadb-config Copyright 2011-2020 MariaDB Corporation AB Get compiler flags for using the MariaDB Connector/C. Usage: mariadb-config [OPTIONS] Compiler: GNU 8.3.1 --cflags [-I/home/baykit/app/mariadb/include/mysql -I/home/baykit/app/mariadb/include/mysql/mysql] --include [-I/home/baykit/app/mariadb/include/mysql -I/home/baykit/app/mariadb/include/mysql/mysql] --libs [-L/home/baykit/app/mariadb/lib/ -lmariadb] --libs_r [-L/home/baykit/app/mariadb/lib/ -lmariadb] --libs_sys [-ldl -lm -lpthread -lgnutls] --version [10.5.10] --cc_version [3.1.13] --socket [/home/baykit/app/mariadb/var/mariadb.sock] --port [3306] --plugindir [/home/baykit/app/mariadb/lib/plugin] --tlsinfo [GnuTLS 3.6.14] --variable=VAR VAR is one of: pkgincludedir [/home/baykit/app/mariadb/include/mysql] pkglibdir [/home/baykit/app/mariadb/lib] pkgplugindir [/home/baykit/app/mariadb/lib/plugin] DB作成 前準備 DB作成の準備として、データベースを格納するディレクトリと、ランタイム情報を格納するディレクトリを作っておきます $ cd ~/app/mariadb/ $ mkdir data var あと、mariadbのコマンド群が実行できるようにPATHを通します export PATH=$HOME/app/mariadb/bin:$PATH これは$HOME/.bash_profileにも書いておきましょう。 初期化 次のコマンドを実行して、MariaDBが管理できるような形にdataディレクトリ内を初期化します(多分w) $ scripts/mariadb-install-db 起動 MariaDBのデーモンプログラムはmariadbd(MySQLだとmysqld)なのですが、通常はこのデーモンプログラムを起動するための別のコマンドmariadbd-safe(MySQLだとmysqld-safe)を実行します。(理由はよくわからんw) mariadbd-safe 210603 06:34:28 mysqld_safe Logging to '/home/baykit/app/mariadb/data/kurage.err'. 210603 06:34:28 mysqld_safe Starting mariadbd daemon with databases from /home/baykit/app/mariadb/data ちなみに、MariaDBの設定ファイルはデフォルトで/etc/my.cnfです。なければ読み込みません。 ただ、/etcはシステムディレクトリなのでここには置きたくないですよね。 というわけで ~/app/mariadb に置くことにしましょう。例によってアンインストールも簡単ですしw 設定ファイルを読ませたい場合以下のようにオプションを指定して起動します。 (ちょっと面倒ですね。だからビルド時に指定できるようにしてくれればいいのにw) $ cd ~/app/mariadb $ touch my.cnf $ mariadbd-safe --defaults-file=~/app/mariadb/my.cnf 接続 mariadbコマンドを実行して、先ほど起動したデーモンに接続しましょう $ mariadb Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 17 Server version: 10.5.10-MariaDB Source distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> ※この「none」ってなーんだ!w と思ったら使用中のDBの名前っぽい。 ユーザー作成 MariaDBには最初から管理者権限であるrootユーザーがいますが、まあ別のDBユーザー作っときましょうw ローカル接続ができるkurageというユーザー(パスワードはinada)を作成し、ありとあらゆる権限を与え、一回抜けます。 MariaDB [(none)]> create user 'kurage'@'localhost' identified by 'inada'; Query OK, 0 rows affected (0.007 sec) MariaDB [(none)]> grant all on *.* to 'kurage'@'localhost'; Query OK, 0 rows affected (0.006 sec) MariaDB [(none)]> \q ユーザーkurageで接続できることを確認します $ mariadb -u kurage -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 16 Server version: 10.5.10-MariaDB Source distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> 接続できました! データベース作成 ではお待ちかね、データベースを作成してみます。kurageユーザーで接続した状態で以下のSQLを実行します。 MariaDB [(none)]> create database salmon; Query OK, 1 row affected (0.000 sec) DB作っただけじゃ使えなくて、次のようにuse文を使って特定のDBを使うことを宣言します。 MariaDB [(none)]> use salmon; Database changed MariaDB [salmon]> そうすると現在使用中のDBの名前が(none)からsalmonに変わったことが確認できるかと思います。 表の作成・挿入・選択 貝の名前を管理するshellという表を作ってみます MariaDB [salmon]> create table shell (id integer primary key, name varchar(128)); Query OK, 0 rows affected (0.047 sec) 牡蠣とアワビを登録します MariaDB [salmon]> insert into shell values (1, 'Oyster'); Query OK, 1 row affected (0.007 sec) MariaDB [salmon]> insert into shell values (2, 'Abalone'); Query OK, 1 row affected (0.013 sec) 選択してみましょう MariaDB [salmon]> select * from shell; +----+---------+ | id | name | +----+---------+ | 1 | Oyster | | 2 | Abalone | +----+---------+ 2 rows in set (0.000 sec) 以上で、SQLが使えるところまで確認しました。 その他 MySQLを別のマシンからアクセス可能にするためには、ポート3306番を外に向けてアクセス可能にしておく必要があります。 この辺りの設定は別ドキュメントにまとめたので参考にしてください 結言 いかがだったでしょうか。 MariaDBの一般ユーザーインストール、何となくやればできそうな感じがしませんかw 最初がちょっと面倒ですが、インストールまで行ってしまえばあとは同じですし、しかも使いやすいと思うので、是非チャレンジしてみてください! Enjoy!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Python3からMySQLのテーブルデータを取得してみた。

勉強中。 すぐ忘れるのでノートとしてのQiita便利じゃない? の続き。 データベースの接続まで出来たので、実行したいのもを書いていく。 上記の画像、カーソルってなんやねんの答え ↓ 平たく言えば、「検索条件に合致するレコードを、1件ずつ取り出すための仕組み」となります。 だそうです。 前回と同様に このページを見ていく。 いろいろテーブルを初期化したり作成したりしてるが 私がやりたいのはもうすでに作られてるテーブルの取得のみ。 なので #!/usr/bin/env python3 import MySQLdb connection = MySQLdb.connect( host='localhost', user='root', passwd='MySQLで設定したPW', db='school', charset='utf8')  #日本語を取り扱うために記入 cursor = connection.cursor()   #カーソルの生成 #一覧を表示 cursor.execute("SELECT * FROM students") #studentsテーブルを表示したい for row in cursor: print(row) # 接続を閉じる connection.close() 内容としてはこんな感じに記入した。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Python3からMySQLサーバにログインを試みた。

なんかわからなくなったら探すのめんどくさいからノートにしてます すぐ忘れるんで。 でもユーザー名とかPWとか隠すのめんどくさい。。 そもそもPython3が入ってなかったので (このサイト)をステップ3まですべて行ってみた。 問題のPythonからMySQLを接続する方法。 DBはschoolというものをもう作っていたのでそこに接続するようにする。 上記のURLを参照 ライブラリのインストールを行っていく。 Debian / Ubuntuの場合 sudo apt-get install python-dev default-libmysqlclient-dev Python3の場合は更に追加で以下のライブラリをインストールします。 sudo apt-get install python3-dev pipから以下のコマンドを入力すればインストールが完了です。 pip install mysqlclient なんかpipあたりでうまくダウンロードできなかったりしたけどその辺しらべたらゴロゴロ出てくる。 touch ファイル名 で適当なファイルを作る。 vim ファイル名 で中身にPythonスプリクトを記入していく。 #!/usr/bin/env python3 import MySQLdb connection = MySQLdb.connect( host='UbuntuのIP', user='MySQLで作ったユーザー名', passwd='UbuntuのPW', db='school') 結果これホストもユーザーもパスワードも書き方全部間違い。 Traceback (most recent call last): File "./school", line 5, in <module> connection = MySQLdb.connect( File "/home/MySQLで作ったユーザー名/.local/lib/python3.8/site-packages/MySQLdb/__init__.py", line 130, in Connect return Connection(*args, **kwargs) File "/home/MySQLで作ったユーザー名/.local/lib/python3.8/site-packages/MySQLdb/connections.py", line 185, in __init__ super().__init__(*args, **kwargs2) MySQLdb._exceptions.OperationalError: (2003, "Can't connect to MySQL server on 'UbuntuのIP:3306' (111)") UbuntuのIPのMySQLサーバにアクセスできませんよーってエラーが出てきた。 一番下の Can't connect to MySQL server で検索をかけてみる。 こんなんでてきた。 言ってることは違うんだけど最後の方をみると、127.0.0.1やlocalhost以外は外部接続になってしまいそれでエラーになるらしい???なのか???(わかってない) なのでhostの部分をlocalhostに変えてみる。 ついでにMySQLだというのを思い出し、UbuntuのパスワードからMySQLのパスワードに書き換えた。 #!/usr/bin/env python3 import MySQLdb connection = MySQLdb.connect( host='localhost', user='MySQLで作ったユーザー名', passwd='MySQLのPW', db='school') Traceback (most recent call last): File "./school", line 5, in <module> connection = MySQLdb.connect( File "/home/MySQLで作ったユーザー名/.local/lib/python3.8/site-packages/MySQLdb/__init__.py", line 130, in Connect return Connection(*args, **kwargs) File "/home/MySQLで作ったユーザー名/.local/lib/python3.8/site-packages/MySQLdb/connections.py", line 185, in __init__ super().__init__(*args, **kwargs2) MySQLdb._exceptions.OperationalError: (1044, "Access denied for user 'MySQLで作ったユーザー名'@'localhost' to database 'school'") あっれまたエラー??? でも今度は違うエラーで 1044, "Access denied for user 'MySQLで作ったユーザー名'@'localhost' to database 'school'" user 'MySQLで作ったユーザー名'のデータベースschoolは拒否された・・と・・? Access denied for userで検索してみる。 これを見たんだけどよくわからない。 ログインで指定した情報と合致するアカウントが複数ある場合、ユーザー名よりホスト名の具体性が高いアカウントが優先して選択されるようです とあるのでMySQLで作ったユーザー名は優先度低いってコト????(ちいかわ風)(よくわかってない) って思ってなんとなくrootで実行したら成功した。 #!/usr/bin/env python3 import MySQLdb connection = MySQLdb.connect( host='localhost', user='root', passwd='MySQLのPW', db='school') 最終的にはこんな感じ。 ./school で実行したらエラーも何も吐かなかったから実行だけされたのだと思う(ここのMySQLに繋いでとしか書いてなかったからね!)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

mysqlのPDOで接続するとstring型になってしまう理由と対策

参考サイト デフォルトモードのPDOでMySQLに接続している場合、int型でも(他の型でも)string型で返ってくるという挙動があり、これは仕様のようです。 解決法1 フェッチした後にキャストすることで対処はできる。  解決法2 PDO::ATTR_EMULATE_PREPARES属性をfalseにすることで型変換を回避する
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Python3からMySQLのテーブルデータを取得してみた。

の続き。 データベースの接続まで出来たので、実行したいのもを書いていく。 上記の画像、カーソルってなんやねんの答え ↓ 平たく言えば、「検索条件に合致するレコードを、1件ずつ取り出すための仕組み」となります。 だそうです。 前回と同様に このページを見ていく。 いろいろテーブルを初期化したり作成したりしてるが 私がやりたいのはもうすでに作られてるテーブルの取得のみ。 なので #!/usr/bin/env python3 import MySQLdb connection = MySQLdb.connect( host='localhost', user='root', passwd='Catjcatj_325', db='school', charset='utf8')  #日本語を取り扱うために記入 cursor = connection.cursor()   #カーソルの生成 #一覧を表示 cursor.execute("SELECT * FROM students") #studentsテーブルを表示したい for row in cursor: print(row) # 接続を閉じる connection.close() 内容としてはこんな感じに記入した。 実行したらこんな感じ studentsテーブル表示できたから成功じゃない?
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む