無料運用 Google Cloud PlatformのAlways Free枠を使う ~DBサーバーへの接続~

2019/11/20

cloud 開発試行

個人開発や学習等でDBを使うにあたり、無料でサーバを運用する方法をまとめました。Google ColaboratoryからGCP上のDBサーバへの接続手順になります。


DBサーバーへの接続


MySQL上で、接続用のtest_db、userを作成する

Hostに依存しないuserを作成します。


apixxxx@dbsvr:~$ sudo mysql

MariaDB [(none)]> create database test_db default charset utf8;
MariaDB [(none)]> create user 'test' identified by 'testxx';
MariaDB [(none)]> grant all on test_db.* to test;
MariaDB [(none)]> select User,Host,plugin from mysql.user;
+---------+-----------+-------------+
| User    | Host      | plugin      |
+---------+-----------+-------------+
| root    | localhost | unix_socket |
| test    | %         |             |
| apixxxx | localhost |             |
+---------+-----------+-------------+

MariaDB [(none)]> user test_db;
MariaDB [test_db]> SET PASSWORD FOR test=PASSWORD('test');

GC上で、Python 3 から MySQL に接続する


#connectorのインストール
!pip install mysql-connector-python-rf

import mysql.connector
from urllib.parse import urlparse

# サーバにconnect       id:password@外部IPAdress:Port/db名
url = urlparse('mysql://test:test@35.212.172.xx:3306/test_db')

conn = mysql.connector.connect(
    host = url.hostname or 'localhost',
    port = url.port or 3306,
    user = url.username or 'root',
    password = url.password or '',
    database = url.path[1:],
)
# connect check retrun=>Bool
print(conn.is_connected())

GC上で、Python 3 から MySQL に接続する

・テーブルを作成して、テストデータをinsertします。
 リストとタプルを利用したbulkinsertもできます。


cursor = conn.cursor()

# テーブルの作成
try:
    cursor.execute("drop table test_db.users")
    cursor.execute("create table test_db.users (id varchar(32), name varchar(32), email varchar(32)) ")
    conn.commit()
except:
    conn.rollback()
    raise

# 作成したテーブルにデータを保存する
try:
    cursor.execute("insert into users values(%s, %s, %s)", (1, "data1", "data1@toiara.com"))
    datas = [
        (2, "data2", "data2@toiara.com"),
        (3, "data3", "data3@toiara.com")
    ]
    cursor.executemany("insert into users values(%s, %s, %s)", datas)
    conn.commit()
except:
    conn.rollback()
    raise

・クエリを実行して、SQL結果を取得し、表示します。


# list形式の結果取得の仕方
print('===== テーブル一覧 =====')
cursor.execute("show tables")
print(cursor.fetchone())
------------------------------------------------------------------------
===== テーブル一覧 =====
('users',)
------------------------------------------------------------------------

print('===== レコード削除 id=2 =====')
cursor.execute('delete from users where id=%s', (2,))
conn.commit()
------------------------------------------------------------------------
===== レコード削除 id=2 =====
------------------------------------------------------------------------

print('===== レコード一覧 list形式 =====')
cursor.execute("select * from test_db.users")
for row in cursor.fetchall():
    print('id:', row[0], 'name:', row[1],'email:', row[2])
------------------------------------------------------------------------
===== レコード一覧 list形式 =====
id: 1 name: data1 email: data1@toiara.com
id: 3 name: data3 email: data3@toiara.com
------------------------------------------------------------------------

# dictionary形式の結果取得の仕方
print('===== レコード一覧 dict形式 =====')
cursor2 = conn.cursor(dictionary=True)
cursor2.execute("select * from test_db.users")
for row in cursor2.fetchall():
    print('id:', row['id'], 'name:', row['name'],'email:', row['email'])
------------------------------------------------------------------------
===== レコード一覧 dict形式 =====
id: 1 name: data1 email: data1@toiara.com
id: 3 name: data3 email: data3@toiara.com
------------------------------------------------------------------------


tosd Noteについて

RSS Feed資格や仕事、サラリーマンとしての備忘録です。

このブログを検索

ブログ アーカイブ

QooQ