SQLite 에서 결과를 csv로 저장하는 방법. PostgreSQL에서는 명령어로 가능했었는데 SQLite에서는 직접 명령어로는 안되는 것 같다고 코파일럿이 알려주었다.
FTP 전송할 때처럼 해봤더니 된다.
sqlite3 result.db << EOF
.headers on
.mode csv
.output output.csv
SELECT * ~~
EOF
요런 식으로 쉘을 작성하면 잘 저장된다.
SQLite 에서 결과를 csv로 저장하는 방법. PostgreSQL에서는 명령어로 가능했었는데 SQLite에서는 직접 명령어로는 안되는 것 같다고 코파일럿이 알려주었다.
FTP 전송할 때처럼 해봤더니 된다.
sqlite3 result.db << EOF
.headers on
.mode csv
.output output.csv
SELECT * ~~
EOF
요런 식으로 쉘을 작성하면 잘 저장된다.
SQLite도 vacuum이 있다. 기본적으로 활성화 되지 않는 것 같다.
방법은 매우 단순하다. SQLite 에서 vacuum을 입력하거나 터미널 입력 창에서 입력해준다.
# sqlite3 finance_data.db "vacuum;"
or
sqlite> vacuum;
PostgreSQL에서도 이런 기능이 있었는지는 모르겠다. 그런데 찾아보다 보니 데이터가 없으면 만들어주고 있으면 바꾸어주는 기능이 있다는 것을 알게 되었다. INSERT OR REPLACE INTO 이렇게 구현하는 것 같다. 블로그에 따라서는 REPLACE INTO 만을 언급하고 있는 것들도 있다.
그래서 이렇게 이용해 보았는데 REPLACE가 되지 않고 INSERT 만 계속 되고 있는 것을 알게 되었다. 다시 검색을 해보니 index가 없을 경우 이런 현상이 있다고 한다.
그래서 다음과 같이 index를 생성해 준다. 여러 번 시행착오를 거친 결과 내가 원하는 형식으로 사용하려면 date와 name 을 이용한 index를 생성하여야 한다. price까지 이용하면, 당일 자료들이 중복되어 생성된다.
CREATE UNIQUE INDEX idx ON stock_trend(name, date);
index를 잘못 만들면, 삭제 후 다시 만들어 준다.
DROP INDEX [IF EXISTS] index_name;
리눅스에서 설치한다. 의존 패키지는 거의 없다시피 하다.
apt install sqlite3
기본적으로 데이터베이스는 다음과 같은 식으로 만들 수 있다. weather 이름을 가진 DB를 만들고 싶으면 다음과 같이 한다.
# sqlite3 weather.db
빈 테이블을 만드는 방법이 딱히 있는게 아닌 것 같다. 일반적으로 이렇게 하면 빈 컬럼이 생성된다.
create table weather("");
컬럼을 추가한다. 속성은 INTEGER, TEXT, BLOB, NUMERIC, REAL 로 5개 뿐이다. Date 등도 텍스트, 실수, 소수 등으로 처리해야 한다.
alter table weather add column frct integer;
alter table weather add column tmp integer;
alter table weather add column pop integer;
alter table weather add column pcp integer;
alter table weather add column wsd real;
alter table weather add column pty integer;
alter table weather add column sky integer;
파이썬에서는 다음과 같이 사용한다. Auto-commit 기능은 isolation_level = None을 이용하면 사용할 수 있다.
import sqlite3
con = sqlite3.connect('weather.db', isolation_level=None)
cur = con.cursor()
con.execute('INSERT INTO weather (frct) VALUES(:frct)', {'frct': 'frct'})