各種言語でデータベース接続(MySQL / mariaDB)方法まとめ

How To mariaDB MySQL Programming

今回はデータベース接続をまとめました。
さて、タイトルで各種言語と言いながら徐々に当初より言語が少なくなりつつありますが、
毎日限られた時間の中で調査、検証して自身のアウトプットのための更新であるため、
記事としては中途半端感はありますがまずは公開しておき、後日徐々に更新して言語を増やせたらと思います。
このところの感想としてgo言語は速い!!
何かをgo言語で実装したい気持ちが強くなってしまいます。

perl / DBI

DBIを使う方法です。

#!/usr/bin/perl
use strict;
use warnings;
use DBI;

my $dsn = "dbi:mysql:database=dbname;host=localhost;port=3306";
my $user = "username";
my $pass ="pass";


# データベースハンドル
my $dbh = DBI->connect( $dsn, $user, $pass, {
    AutoCommit => 1,
    PrintError => 0,
    RaiseError => 1,
    ShowErrorStatement => 1,
    AutoInactiveDestroy => 1
})|| die $DBI::errstr;
my $sth = $dbh->prepare("SELECT count(*) as cnt FROM tablename;");
$sth->execute();
while (my $ary_ref = $sth->fetchrow_arrayref) {
  print "$ary_ref->[0]\n";
}
$sth->finish;
$dbh->disconnect;

python

PyMySQLを使う方法です。

pip install PyMySQL

接続情報(共通)

import pymysql.cursors
conn = pymysql.connect(user = 'username',
                       password = 'pass',
                       host = 'localhost',
                       db = 'dbname',
                       charset='utf8mb4')

insert 文

con = conn.cursor()
sql = "insert into `table_name` (`col1`,`col2`,`col3`,`col4`,`col5`) values(%s,%s,%s,%s,%s)"
con.execute(sql,(col1,col2,col3,col4,col5))
conn.commit()
con.close()

select文

con = conn.cursor()
sql = "select col1, col2 FROM table_name WHERE col1 = %s"
con.execute(sql, ('row',))
result = con.fetchall()
print(result)
con.close()

go

事前準備として以下のSQLドライバを取得します。

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

接続情報(共通)

import (
        "fmt"
        "log"
        "database/sql"
        _"github.com/go-sql-driver/mysql"
)
var db *sql.DB

select文
テーブルに含まれるレコード数をカウントします。

func main() {
        // Instantiate default collector
        db,err := sql.Open("mysql","username:password@/dbname")
        if err != nil{
                log.Fatal("Database Connection Error!!.")
        }
        rows,err := db.Query("select count(*) as Counts from table")
        if err != nil{
                log.Fatal("SQL Rows Error!!.")
        }
        columns,err := rows.Columns()
        if err != nil{
                log.Fatal("SQL Columns Error!!.")
        }
        values := make([]sql.RawBytes,len(columns))
        scanArgs := make([]interface{},len(values))
        for i  := range values{
                scanArgs[i] = &values[i]
        }
        for rows.Next(){
                err = rows.Scan(scanArgs...)
                if err != nil{
                        log.Fatal("SQL rowsNext Error!!.")
                }
                var value string
                for i,col := range values{
                        if col == nil{
                                value = "NULL"
                                }else{
                                value = string(col)
                        }
                        fmt.Println(columns[i],": ",value)
                }
        }
        defer db.Close()
}

例外処理をしっかりと記述を行うのがgoの特徴ですね。