https://growth-coder.tistory.com/241
이전 포스팅에서는 InfluxDB의 개념에 대해 공부하고 설치를 해보았다.
이번 포스팅에서는 CLI와 파이썬으로 InfluxDB에 쿼리를 날리는 방법에 대해서 공부해보려고 한다.
쿼리문 자체는 SQL과 비슷하기 때문에 SQL을 공부해 본 적이 있다면 어렵지 않을 것이다.
우선 influxd를 실행하고 InfluxDB CLI에 접속한다.
데이터베이스
1. 데이터베이스 조회
SHOW DATABASES
2. 데이터베이스 생성
CREATE DATABASE [데이터베이스 이름]
3. 데이터베이스 선택
USE [데이터베이스 이름]
메저먼트(measurement)
메저먼트에 대한 쿼리를 수행하기 전에 USE [데이터베이스 이름] 명령어를 통해 데이터베이스를 선택해야한다.
1. 메저먼트 조회
SELECT * FROM [메저먼트 이름]
2. 메저먼트에 값 삽입
INSERT [메저먼트 이름],[태그1 키]=[태그1 값], [태그2 키]=[태그2 값] [필드1 키]=[필드1 값], [필드2 키]=[필드2 값]
3. 메저먼트 태그 정보 조회
SHOW TAG KEYS FROM [메저먼트 이름]
4. 메저먼트 필드 정보 조회
SHOW FIELD KEYS FROM [메저먼트 이름]
우선 SQL의 테이블과 달리 메저먼트는 스키마가 정해져있지 않고 쿼리문을 날릴 때 생성된다.
그래서 메저먼트를 생성하는 과정이 필요 없고 바로 INSERT 구문을 통해 쿼리문을 날리면 된다.
삽입 쿼리문이 복잡해보이는데 천천히 분석해보자.
전체적인 구조는 다음과 같다.
INSERT [메저먼트 이름],(태그 그룹) (필드 그룹)
메저먼트 이름 다음에 있는 콤마(,)를 통해 이 다음이 태그 그룹과 필드 그룹이 있다는 것을 알려준다.
그리고 태그 그룹과 필드 그룹은 콤마가 아닌 공백으로 구분한다.
태그 그룹과 필드 그룹은 각각 여러 개의 태그 세트와 여러 개의 필드 세트로 이루어져 있다.
그리고 각각의 태그 세트와 필드 세트는 콤마(,)를 통해 구분한다.
(태그 그룹 예시)
[태그 1 이름]=[태그 1 값],[태그 2 이름]=[태그 2 값]...
위와 같이 콤마만 붙인다면 원하는 수의 태그 세트를 넣을 수 있다.
필드 그룹도 마찬가지이다.
예를 들어 student라는 메저먼트는 두 개의 태그(grade, hometown)가 있고 한 개의 필드(name)이 있다고 해보자.
그리고 여기에 grade가 sophomore이고 hometown이 seoul이고 name이 chulsoo인 값을 넣고 싶다고 해보자.
명령어 순서는 다음과 같다.
1. 메저먼트를 넣을 데이터베이스를 선택한다. (없으면 생성 후 선택)
USE [데이터베이스 이름]
2. 값을 삽입한다. (메저먼트 스키마를 짤 필요가 없다.)
INSERT student,grade=sophomore,hometown=seoul name="chulsoo"
3. 값이 삽입되었는지 확인한다.
SELECT * FROM student
참고로 태그 값에는 쌍따옴표를 붙일 필요가 없지만 필드 값이 문자열일 때는 쌍따옴표를 붙여야 한다.
필드 값이 정수라면 쌍따옴표를 붙이지 않는다.
조회를 하면 다음과 같이 time과 태그, 필드들을 확인할 수 있다.
메저먼트 조회를 할 때 원하는 조건만 조회할 수도 있다. 이 역시 SQL과 유사하다.
예를 들어 age가 10 이상인(위에서는 age 필드가 없지만) student의 정보만 가지고 오고 싶다면 다음과 같은 쿼리문을 작성한다.
SELECT * FROM student WHERE age>10
그런데 쿼리문을 작성할 때 조심해야 할 부분이 있다.
바로 태그 값을 기준으로 검색하거나 타입이 문자열인 필드 값을 기준으로 검색할 때이다.
태그 값을 기준으로 검색하거나 문자열 타입인 필드 값을 기준으로 검색할 때 반드시 값에 홑따옴표(')를 붙여야 한다.
쌍따옴표(")가 아닌 홑따옴표(')이다.
쌍따옴표를 붙이거나 아무것도 붙이지 않는다면 오류를 반환하는게 아니라 empty result를 반환한다.
참고로 타입이 float이거나 int인 필드 값을 기준으로 검색할 때는 아무것도 붙이지 않는다.
grade가 sophomore인 student를 조회하고 싶다면 다음과 같은 쿼리문을 작성한다.
SELECT * FROM student WHERE grade = 'sophomore'
age가 필드 키라고 하고 저장할 때 정수로 저장했을 때 age가 10 이상인 student를 조회할 때는 다음과 같다.
SELECT * FROM student WHERE age>10
그런데 만약 age가 필드 키가 아닌 태그 키였다면 다음과 같이 홑따옴표를 붙여야 한다.
SELECT * FROM student WHERE age>'10'
태그 값에는 무조건 홑따옴표를 붙이고 필드 값에는 문자열 타입일 경우에만 홑따옴표를 붙인다.
이전 포스팅에서도 설명을 했지만 태그 값은 String 타입만 지원하고 필드 값은 String, Float, Integer, Boolean을 지원한다.
이외에도 다양한 명령어가 있는데 궁금하다면 다음 공식 문서를 참고하기를 바란다.
https://docs.influxdata.com/influxdb/cloud/query-data/influxql/explore-data/
HTTP API
influxDB는 HTTP API를 지원하기 때문에 이를 통해 저장 및 조회를 할 수 있다.
우선 쿼리를 보내기 위해서 인증을 진행해야 한다.
인증 과정은 Token Authentication, Basic Authentication, Querystring Authentication이 있지만 그 중 Token Authentication을 사용하려고 한다.
이전 포스팅에서 관리자 토큰을 받아서 보관했었는데 이를 사용하면 된다.
물론 관리자 토큰이 아닌 다른 토큰을 생성해서 사용하는 것이 권장사항이지만 이번 포스팅에서는 관리자 토큰을 사용할 예정이다.
토큰 생성하는 방법은 다음 공식 문서를 참고하기를 바란다.
그러면 HTTP API를 사용하여 값을 삽입하는 방법을 알아보자.
API 버전도 다양한데 그 중 2.7 버전을 사용해보자.
엔드포인트는 /api/v2/write 이다.
필요로 하는 값은 다음과 같다.
우선 인증을 위한 토큰은 Authorization 헤더에 넣는데 "Token"이라는 문자열을 토큰 앞에 붙여야 한다.
토큰이 "abcd1234"라면 Authorization 헤더에는 "Token abcd1234"를 넣으면 된다.
그리고 organization과 Bucket(데이터베이스), Timestamp precision의 경우는 url에 query string으로 넣는다.
request body에는 text/plain 형식으로 쿼리문을 작성하는데 INSERT 부분을 제외하고 넣으면 된다.
postman으로 테스트를 해보자.
헤더는 다음과 같다.
바디는 다음과 같다.
값을 삽입하고나서 다시 CLI로 SELECT 쿼리를 날려서 잘 적용되었는지 확인해보자.
더 다양한 API는 공식 문서를 참고하기를 바란다.
https://docs.influxdata.com/influxdb/v2.7/api-guide/api_intro/
참고
https://docs.influxdata.com/influxdb/cloud/query-data/influxql/explore-data/
https://docs.influxdata.com/influxdb/v2.7/api-guide/api_intro/
'공부 > Database' 카테고리의 다른 글
[MySQL] Procedure 사용법 (2) | 2024.09.30 |
---|---|
[Database] InfluxDB 개념 및 설치 (0) | 2023.08.29 |
[Database] 자기 테이프와 CD-ROM의 특성 (0) | 2022.12.22 |
[Database] 트랜잭션(transactioin) 개념과 동시성의 중요성 (0) | 2022.12.03 |
[Database] Index structures (multi-level oredered) B-tree와 B+ tree (0) | 2022.12.02 |
댓글