dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

mysqldump したデータを取り込んだ場合の外部キー制約に関する検証のメモ

2019-12-28 21:04:06 | mysql
mysqldump したデータを取り込んだ場合の外部キー制約に関する検証のメモ。

外部キー制約の関係がある 2つのテーブルを条件指定つきで mysqldump で出力して、
その結果をロードした場合に、外部キー制約が効いているかを検証してみました。

結果としては、外部キー制約が効いていないレコードが登録された状態になります。

まず、以下の2つのテーブルを定義します。
constraint1 テーブルには id だけを登録します。
constraint2 テーブルには、constraint1 テーブルに id が登録されている id に対してのみ、
val を登録します。
create table constraint1 (
       id    int not null,
       primary key(id)
) ENGINE=InnoDB;

create table constraint2 (
       id    int not null,
       val   varchar(20) not null,

       primary key(id),
       foreign key (id)
               references constraint1(id)
               on delete cascade
) ENGINE=InnoDB;

insert into constraint1 set id = 1;
insert into constraint1 set id = 2;
insert into constraint1 set id = 3;
insert into constraint1 set id = 4;
insert into constraint1 set id = 5;

insert into constraint2 set id = 1, val = "val1";
insert into constraint2 set id = 2, val = "val2";
insert into constraint2 set id = 3, val = "val3";
insert into constraint2 set id = 4, val = "val4";
insert into constraint2 set id = 5, val = "val5";

各テーブルには以下のようにレコードが登録されています。
mysql> select * from constraint1;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
+----+
5 rows in set (0.00 sec)

mysql> select * from constraint2;
+----+------+
| id | val  |
+----+------+
|  1 | val1 |
|  2 | val2 |
|  3 | val3 |
|  4 | val4 |
|  5 | val5 |
+----+------+
5 rows in set (0.00 sec)

ここで、constraint1 のテーブルから id=5 のレコードを削除すると、
constraint2 のテーブルからも id=5 のレコードが削除されます。
mysql> delete from constraint1 where id = 5;
Query OK, 1 row affected (0.01 sec)

mysql> select * from constraint1;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
+----+
4 rows in set (0.00 sec)

mysql> select * from constraint2;
+----+------+
| id | val  |
+----+------+
|  1 | val1 |
|  2 | val2 |
|  3 | val3 |
|  4 | val4 |
+----+------+
4 rows in set (0.00 sec)

この状態で以下の mysqldump コマンドでテーブルを dump します。
mysqldump -u{id} -p{password} {db} constraint1 -w 'id <= 2' > dump_constraint1_2.sql
mysqldump -u{id} -p{password} {db} constraint2

constraint1 は id=1, 2 のレコードしか抽出しません。
一方、constraint2 は id=3, 4 のレコードも抽出します。
これらのデータを取り込んだ際に、constraint2 で id=3,4 のレコードが登録されるかを確認します。
cat dump_constraint1_2.sql | mysql -u{id} -p{password} {db}
cat dump_constraint2.sql | mysql -u{id} -p{password} {db}

結果は以下の通り。
mysql> select * from constraint1;
+----+
| id |
+----+
|  1 |
|  2 |
+----+
2 rows in set (0.00 sec)

mysql> select * from constraint2;
+----+------+
| id | val  |
+----+------+
|  1 | val1 |
|  2 | val2 |
|  3 | val3 |
|  4 | val4 |
+----+------+
4 rows in set (0.00 sec)

constraint1 に登録されていない id のレコードが、constraint2 にも登録された状態になります。

curl で BASIC 認証のID・パスワードを指定する方法

2019-12-21 15:26:52 | linux
curl で BASIC 認証のID・パスワードを指定する方法。
curl --basic -u {id}:{パスワード} URL


digest 認証の場合には、--digest を指定します。
curl --digest -u {id}:{パスワード} URL


その他のオプション。
-s:         プログレスメーター、エラーメッセージを非表示。
-v:         デバッグ情報を表示
-o:         出力先のファイルを指定
--insecure: SSL証明を無視


python の http.client で html をダウンロードする方法

2019-12-21 14:22:07 | python
python の http.client で html をダウンロードする方法のメモ。

requests.get(url) で簡単に html をダウンロードできましたが、
url にポート番号を入れたらダウンロードできなかったので、
http.client を使ってみました。
import http.client

host = 'localhost' # ホスト名
port = 5104 # ポート番号
request_path = '/index' # パス

conn = http.client.HTTPConnection(host, port)

conn.request('GET', request_path)
response = conn.getresponse()

conn.close()

html = response.read().decode('utf-8')
print(html)


python で excel ファイルを生成する方法

2019-12-08 16:39:36 | python
python で excel ファイルを生成する方法のメモ。

pandas で excel ファイルを生成することができます。
import pandas as pd

data = [['colun_a', 'column_b'],
        [1, 2],
        [3, 4],
        [5, 6],
        ]

# 出力
df = pd.DataFrame(data)
df.to_excel(ファイル名, index=False, header=False)


■実行結果
以下のデータの excel ファイルが生成されます。
colun_a	column_b
1	2
3	4
5	6




python で excel ファイルを読み込む方法

2019-12-08 16:24:28 | python
python で excel ファイルを読み込む方法のメモ。

pandas で excel ファイルの読み書きを行うことができます。
import pandas as pd

# excel ファイルを読み込み
df = pd.read_excel(ファイル名, シート番号(0オリジン), index_col=None)

# 行数・列数
num_rows = df.shape[0]
num_cols = df.shape[1]

# データ参照
for r in range(0, num_rows):
    for c in range(0, num_cols):
        # セルの値を参照
        val = df.iat[r, c]

        # 標準出力に出力
        print("[%d, %d]: %s" % (r, c, val))