// it's for Latex

pages

[How to connect Python programs to MariaDB in NAS] #08. Insert File to NAS Database From PC using mysql-python through Internet (external address)

이제 NAS는 Database 환경이 구축되었고, PC에서는 NAS의 Database에 Internet을 이용하여 접근할 수 있도록 mysql-python을 이용한 Programming이 되어있다.
이제 PC 내에 존재하는 File 하나를 NAS Database에 보내보도록 하겠다.


작업환경
- OS : Windows 10
- PC : LattePanda 4G RAM 64G eMMC (DFR0419)
- NAS : DS1618+
- Python : 3.6.8
- Tool : Pycharm
- PC와 NAS는 다른 네트워크
- PC와 NAS는 각각 Internet이 가능한 상태



1. Database 설정


NAS를 초기에 설정할 때, 사용자의 database를 만들게 된다.
아래 사진을 따라가서 마지막에 파란색 사각형이 바로 사용자의 database이다.





만약 본인의 NAS에 사용자 database가 존재하지 않는다면 다음 사이트를 참조하여 만들 수 있다. 

2. table 설정


user database가 만들어지게 되면 초기에는 내부에 아무런 table도 존재하지 않는다.
table이란 database 내부에서 어떠한 data들로 구분될지 정해지는 하위 목록이라고 보면 되겠다.

우리가 올리고자 하는 data는 blob형태인데 이 때 blob이란 Large Binary Object의 준 말로 일반적인 txt, image, video 등의 file들을 binary 형태로 저장할 수 있게 한다.

table을 설정하는 과정은 아래 영상을 참고하면 되겠다.

위 영상이 조금 번잡해보일 수 있기 때문에 내 설정을 사진으로 보이자면 다음과 같다.

(1) New를 클릭하여 table 생성



(2) table 세부 설정

  1) 테이블 이름에 원하는 table명 적기 (i.e. data)
  2) column 값 2로 설정 ( 해당 table에서 우리가 사용할 data 종류가 2개이기 때문)
  3) id / INT / A_I check 하여 row 1개 생성 ( INT 형태, A_I : INDEX 역할 )
  4) file / LONGBLOB row 1개 생성 ( BLOB은 그 크기에 따라 MEDIUMBLOB, BLOB, LONGBLOB으로 나뉘는데, 필자의 file은 크기가 크므로 LONGBLOB을 선택)
  5) 생성


(3) 확인

아래 사진을 보면 생성된 초기에는 아무런 data도 존재하지 않는 것을 확인할 수 있음.


3. 위 정보들을 이용한 Python Programming


기존의 #07의 Code에서는 단순한 Integer data를 Internet을 이용해 Database에 Upload하게 된다. 하지만 이번에는 PC 내에 존재하는 File을 Code를 이용해 Binary Data로 변환하여 BLOB 파일화 한 이후에 NAS의 Database에 전달하게 된다. 그리 어렵진 않으니 아래 예시로 충분할 것이며, 다음 사이트를 참고하여 Coding하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/usr/bin/python
import mysql.connector as mariadb
from mysql.connector import Error
def convertToBinaryData(filename):
   #Convert digital data to binary format
   with open(filename, 'rb') as file:
       binaryData = file.read()
   return binaryData
def insertBLOB(emp_id, dataFile):
   print("Inserting BLOB into bin_data table")
   try:
       connection = mariadb.connect(host='#07의 2번에서 확인한 NAS DDNS의 외부주소', user='#06의 3번에서 확인한 user 명 입력', port='#06의 6번에서 확인된 Port 번호 입력', password='#06의 3번에서 login에 사용되는 password 입력', database='#06의 4번에서 확인된 db 명 입력')
       if connection.is_connected():
           db_Info = connection.get_server_info()
           print("Connected to MySQL database... MySQL Server version on ", db_Info)
           cursor = connection.cursor()
           cursor.execute("select database()")
           record = cursor.fetchone()
           print("Your connected to -", record)
           # for inserting blob data
           sql_insert_blob_query = """ INSERT INTO `data_bin`
                      (`id`,`file`) VALUES(%s, %s)"""

           binDataFile = convertToBinaryData(dataFile)
           # Convert data into tuple format
           insert_blob_tuple = (emp_id, binDataFile)
           result = cursor.execute(sql_insert_blob_query, insert_blob_tuple)
           connection.commit()
           print("File inserted successfully as a BLOB into bin_data table", result)
   except Error as e:
       print("Error while connecting to MySQL", e)
       connection.rollback()
       # for inserting BLOB data
       print("Failed inserting BLOB data into MySQL table {}".format(e))
   finally:
      # closing database connection
       if(connection.is_connected()):
           cursor.close()
           connection.close()
           print("MySQL connection is closed")
insertBLOB(2"C:\Data\\any_data_that_you_want_to_upload")
cs

*** Error
# for inserting blob data
           sql_insert_blob_query = """ INSERT INTO `data_bin`
                      (`id`,`file`) VALUES(%s, %s)"""
위 부분에서 에러가 발생한 적이 있었는데, 다른 내용은 아니고
` 를 '로 써서 그런 것이었다.

댓글 없음:

댓글 쓰기