Category: SQL

  • SQLite, CSV

    SQLite 에서 결과를 csv로 저장하는 방법. PostgreSQL에서는 명령어로 가능했었는데 SQLite에서는 직접 명령어로는 안되는 것 같다고 코파일럿이 알려주었다.

    FTP 전송할 때처럼 해봤더니 된다.

    sqlite3 result.db << EOF
    .headers on
    .mode csv
    .output output.csv
    
    SELECT * ~~
    
    EOF

    요런 식으로 쉘을 작성하면 잘 저장된다.

  • [SQLite] vacuum

    SQLite도 vacuum이 있다. 기본적으로 활성화 되지 않는 것 같다.

    방법은 매우 단순하다. SQLite 에서 vacuum을 입력하거나 터미널 입력 창에서 입력해준다.

    # sqlite3 finance_data.db "vacuum;"
    
    or
    
    sqlite> vacuum;
  • [SQLite3] REPLACE INTO

    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;
  • [SQLite] 시작

    리눅스에서 설치한다. 의존 패키지는 거의 없다시피 하다.

    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'})