Python에서 CSV를 읽은 후 MySQL 작업 (INSERT) 해보십시오 (mysql-connector-python)

여러가지 막혔으므로, 준비 단계의 순서도 쓰고 있습니다.

시도한 것



【1】MySQL(8.0.16) 인스톨, 테스트용 데이타베이스의 준비
【2】mysql-connector-python(8.0.16)의 준비
[3] 입력 데이터와 파이썬 소스 준비, 테스트
  (소스내의 조작)
  → CSV 읽기
레코드를 localhost testdb의 testtbl로 INSERT.
확인을 위해 testtbl을 읽고 dbchkfile.csv에 씁니다.
【4】확인

환경 정보



파이썬 3.7.2
macOS Mojave 10.14.4
Visual Studio code로 소스는 준비.

【1】MySQL 설치, 테스트용 DB 준비



일단 brew를 업데이트.
$ brew update

이어 MySQL을 설치.
mysql 8.0.16입니다.
$ brew install mysql

움직이는지 확인.
$ mysql.server start

SUCCESS! OK. 괜찮아.
root 사용자로 시작.
$ mysql -u root

root에 대한 비밀번호를 설정합니다.
※MySQL8 에서는 alter ... 로 패스워드를 변경합니다. 주의.
mysql> use mysql;
mysql> alter user 'root'@'localhost' identified by '任意のパスワード';

일단 종료하고 나서・・・
mysql> exit;

비밀번호를 사용하여 다시 로그인합니다.
방금 설정한 임의 암호를 입력 후 Enter로 로그인합니다.
$ mysql -u root -p

로그인할 수 있었습니다.
그럼 여기서 테스트용 데이터베이스를 만들어 둡니다.
mysql> CREATE DATABASE testdb DEFAULT CHARACTER SET utf8;

MySQL에서 빠지는 것은\q.

【2】mysql-connector-python 준비



그런 다음 mysql-connector-python 설치.

미리 pip를 업그레이드하십시오 ...
python -m pip install --upgrade pip

2019.05.18 현재 최신 버전(8.0.16)으로,
mysql-connector-python을 설치.

(확인 : htps : //에서 v. mysql. 코 m/두 w응아 ds/안녕 c와 r/py 텐/)
$ python -m pip install mysql-connector-python==8.0.16

successfully installed mysql-connector-python-8.0.16 protobuf-3.7.1

할 수 있었습니다.
확인해 둡니다.
$ python -m pip freeze

mysql-connector-python==8.0.16

목록에 표시가 있습니다. 괜찮아요.

그리고 실제로 파이썬에서 mysql을 조작 할 수 있는지 시도해 보겠습니다.

[3] 입력 데이터와 파이썬 소스 준비, 테스트



입력용 infile.csv 는, 이런 것을 준비해 두었습니다. 이전에 사용한 사람.


읽기 ~ 쓰기에는 이런 소스 코드를 써 보았습니다.
(소스 내의 조작)
 → CSV 읽기
레코드를 localhost testdb의 testtbl로 INSERT.
확인을 위해 testtbl을 읽고 dbchkfile.csv에 씁니다.

Visual Studio Code에서 작업했지만,
mysql-connector-python을 인식하지 못할 때,
command + shift + P → select interpreter 로 전환해 보는 것도 좋다.
모르겠지만.

csv_to_mysql.py

# CSVファイルを読み書きするため、標準ライブラリcsvを使用する。
import csv
# MySQLの操作
import mysql.connector


#自分のローカルのMysqlへの接続 passwdには先ほど設定したrootのパスを入力
connect = mysql.connector.connect(user='root',password='********',host='localhost',database='testdb',charset='utf8')
cursor = connect.cursor()

#テーブルの作成(今回項目列名は下記で読み込むCSVの項目別変数と同一のものを使用している。桁数は適当。)
cursor.execute('create table testtbl ({} char(10) PRIMARY KEY,{} varchar(20),{} int(8),{} int(1),{} int(7),{} varchar(60),{} varchar(60),{} int(8),{} int(8),{} int(8),{} int(1),{} int(1),{} int(8));'.format('number', 'name', 'birthymd', 'sex', 'post', 'adr1', 'adr2', 'ymd_sinsei', 'ymd_nintei', 'ymd_happu', 'types', 'pet', 'ymd_test'))

with open('infile.csv') as infile, \
    open('dbchkfile.csv', 'w', encoding='utf-8') as chkfile:
    count = 0
    for line in infile:
        # 読み込んだ行の項目を順にカンマ区切りで対応する変数へ文字列としてmapする。
        number, name, birthymd, sex, post, adr1, adr2, ymd_sinsei, ymd_nintei, ymd_happu, types, pet, ymd_test = map(str, line.split(','))
        if count > 0:
            # MySQLDBへの格納出力(insert)。上記で読み込んで保持している変数の値をformatで突っ込むので、valuesの{}側をエスケープ\とシングルクオーテーション'で囲んでおく。
            cursor.execute('INSERT INTO testtbl (number,name,birthymd,sex,post,adr1,adr2,ymd_sinsei,ymd_nintei,ymd_happu,types,pet,ymd_test) values(\'{}\',\'{}\',\'{}\',\'{}\',\'{}\',\'{}\',\'{}\',\'{}\',\'{}\',\'{}\',\'{}\',\'{}\',\'{}\');'.format(number,name,birthymd,sex,post,adr1,adr2,ymd_sinsei,ymd_nintei,ymd_happu,types,pet,ymd_test))

            # コンソール出力
            print(u"{}人目の処理を行っています".format(count))
        count = count + 1
    # 項目名列は処理対象の行としてカウントしない
    count = count - 1
    print(u'{} 件を処理しました。'.format(count))

    # 確認用に操作中テーブルからレコード取得
    cursor.execute('select * from testtbl;')
    rows = cursor.fetchall()

    # 取得したレコードを外部出力。
    for row in rows:
        # エラーが出るため数値は文字へ一旦変換
        row_str = map(str,row)
        # 出力
        print(','.join(list(row_str)), file=chkfile)

# DB操作の終了。
# insert処置後のcommitも。
cursor.close()
connect.commit()
connect.close()

막상 실행!
$ python3 csv_to_mysql.py
1人目の処理を行っています
2人目の処理を行っています
3人目の処理を行っています
4人目の処理を行っています
5人目の処理を行っています
6人目の処理を行っています
7人目の処理を行っています
8人目の処理を行っています
9人目の処理を行っています
10人目の処理を行っています
11人目の処理を行っています
12人目の処理を行っています
12 件を処理しました。

괜찮다.

【4】확인



먼저 확인을 위해 내보낸 dbchkfile.csv를 살펴 보겠습니다.



괜찮을 것 같습니다.

그런 다음 MySQL 테이블에 대한 데이터 저장 상태를 터미널에서 확인합니다.

MySQL에 패스워드 첨부 로그인.
$ mysql -u root -p

database를 선택.
mysql> use testdb;

테이블이 생성되었는지 확인.
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| testtbl          |
+------------------+
1 row in set (0.00 sec)

할 수 있습니다.

테이블의 항목 정의 상태도 확인.
mysql> describe testtbl;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| number     | char(10)    | NO   | PRI | NULL    |       |
| name       | varchar(20) | YES  |     | NULL    |       |
| birthymd   | int(8)      | YES  |     | NULL    |       |
| sex        | int(1)      | YES  |     | NULL    |       |
| post       | int(7)      | YES  |     | NULL    |       |
| adr1       | varchar(60) | YES  |     | NULL    |       |
| adr2       | varchar(60) | YES  |     | NULL    |       |
| ymd_sinsei | int(8)      | YES  |     | NULL    |       |
| ymd_nintei | int(8)      | YES  |     | NULL    |       |
| ymd_happu  | int(8)      | YES  |     | NULL    |       |
| types      | int(1)      | YES  |     | NULL    |       |
| pet        | int(1)      | YES  |     | NULL    |       |
| ymd_test   | int(8)      | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
13 rows in set (0.00 sec)

지정대로 되어 있습니다.

레코드가 포함되어 있는지 확인합니다.
mysql> select count(number) from testtbl;
+---------------+
| count(number) |
+---------------+
|            12 |
+---------------+
1 row in set (0.00 sec)

이번 로딩 대상으로 한 infile.csv 내의 12건이 들어 있을 것 같습니다.

표시해 봅니다.
mysql> select * from testtbl;
+------------+--------------------+----------+------+---------+---------------------+----------------------------------+------------+------------+-----------+-------+------+----------+
| number     | name               | birthymd | sex  | post    | adr1                | adr2                             | ymd_sinsei | ymd_nintei | ymd_happu | types | pet  | ymd_test |
+------------+--------------------+----------+------+---------+---------------------+----------------------------------+------------+------------+-----------+-------+------+----------+
| 0000111111 | 安藤 太一郎       | 19860602 |    1 | 1231111 | AAA県BBB市CCC-123   | サンプルヴィラA 001号室          |   20190501 |   20190507 |  20190507 |     1 |    0 | 20200229 |
| 0000222222 | 伊藤 炭二郎       | 19920505 |    1 | 1232222 | AAA県BBB市CCC-123   | サンプルヴィラB 002号室          |   20190501 |   20190514 |  20190514 |     2 |    1 | 20200228 |
| 0000333333 | 鵜飼 多三枝       | 19990909 |    2 | 1233333 | AAA県BBB市CCC-123   | サンプルヴィラC 003号室          |   20190501 |   20190514 |  20190514 |     1 |    2 | 20200131 |
| 0000444444 | 江崎 幸四郎       | 19870831 |    1 | 1234444 | AAA県BBB市CCC-123   | サンプルヴィラD 004号室          |   20190501 |   20190507 |  20190507 |     2 |    0 | 20191231 |
| 0000555555 | 岡本 小五郎       | 19520205 |    1 | 1235555 | AAA県BBB市CCC-123   | サンプルヴィラE 005号室          |   20190601 |   20190615 |  20190615 |     1 |    2 | 20191130 |
| 0000666666 | 柿崎 喜六郎       | 19811030 |    1 | 1236666 | AAA県BBB市CCC-123   | サンプルヴィラF 006号室          |   20190601 |   20190608 |  20190608 |     1 |    2 | 20191129 |
| 0000777777 | 城島 香七子       | 19721103 |    2 | 1237777 | AAA県BBB市CCC-123   | サンプルヴィラG 007号室          |   20190601 |   20190608 |  20190608 |     2 |    1 | 20191030 |
| 0000888888 | 釘宮 亜八芽       | 19330303 |    2 | 1238888 | AAA県BBB市CCC-123   | サンプルヴィラH 008号室          |   20190501 |   20190507 |  20190507 |     1 |    1 | 20190401 |
| 0000999999 | 敬堂 勘九郎       | 19680229 |    1 | 1239999 | AAA県BBB市CCC-123   | サンプルヴィラI 009号室          |   20190601 |   20190615 |  20190615 |     2 |    0 | 20190331 |
| 1111000000 | 小柳 猿十郎       | 19200222 |    1 | 1240000 | AAA県BBB市CCC-123   | サンプルヴィラJ 010号室          |   20190501 |   20190507 |  20190507 |     2 |    1 | 20190228 |
| 1111111111 | 佐渡 十一郎       | 19430130 |    1 | 1241111 | AAA県BBB市CCC-123   | サンプルヴィラK 011号室          |   20190601 |   20190608 |  20190608 |     1 |    0 | 20190227 |
| 1111222222 | 宍戸 十二郎       | 19530301 |    1 | 1242222 | AAA県BBB市CCC-123   | サンプルヴィラL 012号室          |   20190501 |   20190507 |  20190507 |     2 |    1 | 20190131 |
+------------+--------------------+----------+------+---------+---------------------+----------------------------------+------------+------------+-----------+-------+------+----------+
12 rows in set (0.01 sec)

괜찮을 것 같습니다.



할 수 있었습니다.
미안해.

좋은 웹페이지 즐겨찾기