[Review]SQLite

FreeZeeSun·2023년 10월 26일
0
post-thumbnail


왜 마지막에 'asdf':'asdf' 부분은 반영되지 않은걸까.
에러도 나지 않고.
존재하지 않는 컬럼이라서 그런걸까?


중복되는것 중 마지막 것이 할당된 것을 알 수 있다.. (왜!??)

하다가 드는 의문점.. 엑셀이나 oracle DB에라도 데이터 테이블을 만들어놓고 확인하면서 코드를 짜면 안되려나?....

데이터 테이블 전체를 바로바로 확인하기가 힘드니까 너무 답답하다.....


여기서도 commit 을 안해주면 반영이 안된다.


lastrowid 는 뭐지..?

생각났다. 마지막 row 번호를 알려준다. 하지만, 위의 상황처럼 commit 을 하기 전에 close 를 해버리면 없어질 번호니 맹신금지라고 한거다.

원래 fetchall() 은 다 뽑아줘야하는데 뒤에 인덱싱을 붙이니 마지막 하나만 보인다.

응용가능^^

iterdump()


con을 열어서 지금까지 내가 했던 실행 기록을 보여준다.
iterdump 를 하면 자동 commit 이 되는 줄 알았는데...
그래서 테스트1,2,3 insert 한 컬럼이 존재하는줄 알았다.

하지만 update 구문은 반영되지 않았다.

insert 구문으로 테스트를 해봤는데, 자동 커밋은 되지 않는걸 확인할수 있었다...
그렇다면, 더더욱 의문인게 create 하고 insert 했던 구문은 왜 남아있었던 거지???


너무 짜릿하다....
결국, commit 의 기준은 iterdump 도 아니고...
insert 구문이라서도 아니고...
executescript 라는 한번에 여러 sql 구문을 실행해주는 명령어 안에 create 라는 auto commit 이 수행되는 쿼리가 존재하면 같이 한번에 실행되기에 덩달아 자동커밋이 되는 것 같다!!

SNS

con = sqlite3.connect('sns.db')
cur = con.cursor()

cur.executescript('''
    CREATE TABLE POST(
        PK INTEGER PRIMARY KEY,
        CONTENT TEXT
    );
    CREATE TABLE HASHTAG(
        PK INTEGER PRIMARY KEY,
        COUNT INTEGER DEFAULT 0,
        NAME TEXT
    );
    CREATE TABLE POSTTAG(
        PPK INTEGER NOT NULL,
        HPK INTEGER NOT NULL
    );
''')

data = {'tag':'ORM'}

cur.execute('''
    SELECT COUNT(*) FROM HASHTAG
    WHERE NAME =:tag
''', data)
cur.fetchone()[0]

if cur.fetchone()[0] == 0:
    cur.execute('''
        INSERT INTO HASHTAG(NAME) VALUES (:tag)
    ''', data)
    con.commit()

cur.execute('''
    SELECT PK
    FROM HASHTAG
    WHERE NAME =:tag
    LIMIT 0,1
''', data)

PK = cur.fetchone()[0]

data1 = {'content':'본문1', 'tags':['Python']}

cur.execute('INSERT INTO POST(CONTENT) VALUES(:content)', data1)
con.commit()
PPK = cur.lastrowid
cur.execute('SELECT * FROM POST')
cur.fetchall()

for tag in data1['tags']:
    data2 = {'tag':tag}
    
    cur.execute('''
        SELECT COUNT(*) FROM HASHTAG
        WHERE NAME =:tag
    ''', data2)
    
    if cur.fetchone()[0] == 0:
        cur.execute('''
            INSERT INTO HASHTAG(NAME) VALUES(:tag)
        ''', data2)
        con.commit()
        
    cur.execute('''
        SELECT PK
        FROM HASHTAG
        WHERE NAME =:tag
        LIMIT 0,1
    ''', data2)
    
    TPK = cur.fetchone()[0]
    
    cur.execute('INSERT INTO POSTTAG VALUES(?,?)', [PPK, TPK])
    cur.execute('''
        UPDATE HASHTAG SET COUNT = COUNT +1
        WHERE PK = ?
    ''', [TPK])
    con.commit()

와.. 코드를 한줄한줄 곱씹으면서 내가 하고 싶은 방향도 가보고 하니, 너무 재밌다!!
선생님의 코드 짜는 여러가지 방식도 너무 재밌다ㅠㅠ 시간만 나에게 주어진다면...

profile
개발자 지망생. 지금은 삽질의 연속, 하지만 언젠가는 삽질이 아닐 것이기에!

0개의 댓글