[SQLite3] index column 중복 방지 및 인자 미입력시 PK 값 자동 증가 in Python

I Want!

  • Primary key 값이 아닌 다른 index column의 중복이 들어감을 방지하고 싶었다.
  • insert values의 인자값으로 아무것도 넣지 않아도 ID값이 자동으로 채워지게 하고 싶었다.

AUTOINCREMENT, UNIQUE INDEX 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import os
import sqlite3
DB_FILENAME = "twitter_db.sqlite3"
DB_FILEPATH = os.path.join(os.getcwd(), DB_FILENAME)

# 커넥트 및 커서 생성
conn = sqlite3.connect(DB_FILENAME)
cur = conn.cursor()

# 스키마 생성(id 값 Auto increment 설정 : 인자값으로 아무것도 넣지 않아도 자동으로 중복되지 않고 증가하여 입력됨)
cur.execute("DROP TABLE IF EXISTS user;")
cur.execute("""CREATE TABLE user(
            id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
            screen_name VARCHAR
            );""")

cur.execute("DROP TABLE IF EXISTS tweet;")
cur.execute("""CREATE TABLE tweet(
            id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
            full_text VARCHAR,
            user_id INTEGER,
            FOREIGN KEY(user_id) REFERENCES user(id)
            );""")
  • CREATE UNIQUE INDEX 메소드를 통해 중복값이 있을 수 없는 column으로 만들어준다.
1
cur.execute("CREATE UNIQUE INDEX nameindex ON user (screen_name);")
  • INSERT를 할 때 기존에 있던 중복 값을 넣으면 오류가 발생해야 하는데, OR IGNORE INTO와 함께 사용해 명령어 오류 발생을 무시하여 미연에 중복을 방지
1
2
3
4
5
def add_user(username, connection, cursor):
    cursor.execute("INSERT OR IGNORE INTO user (screen_name) VALUES (?)", (username,))
    connection.commit()
    cursor.execute("SELECT * FROM user WHERE screen_name = (?)", (username,))
    return cursor.fetchone()
0%