■ SQlite3 데이터 타입과 대응하는 파이썬 데이터 타입을 보여준다. ▶ 표
|
============================= SQLite3 자료형 파이썬 자료형 ============== ============= NULL None INTEGER int REAL float TEXT str, bytes BLOB buffer ============================= |
■ SQlite3 명령줄 실행 프로그램을 만드는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
import re import sqlite3 import sys def PrintIntroduction(): print("pysqlite는 명령줄 프로그램입니다.") print("명령어를 알고 싶으시면 \".도움말;\"를 입력해 주시기 바랍니다.") print("SQL 구문은 ';'으로 끝나야 합니다.") def PrintHelp(): print(".덤프\t\t데이터베이스의 내용을 출력합니다.") def DumpDatabase(connection, filePath = None): if filePath != None: f = open(filePath, "w") else: f = sys.stdout for line in connection.iterdump(): f.write("{0}\n".format(line)) if f != sys.stdout: f.close() if len(sys.argv) == 2: path = sys.argv[1] else: path = ":memory:" connection = sqlite3.connect(path) connection.isolation_level = None cursor = connection.cursor() buffer = "" PrintIntroduction() while True: line = input("pysqlite>> ") if buffer == "" and line == "": break buffer += line if sqlite3.complete_statement(buffer): buffer = buffer.strip() if buffer[0]==".": command = re.sub("[ ;]", " ", buffer).split() if command[0] == ".도움말": PrintHelp() elif command[0] == ".덤프": if len(command) == 2: DumpDatabase(connection, command[1]) else: DumpDatabase(connection) else: try: buffer = buffer.strip() cursor.execute(buffer) if buffer.lstrip().upper().startswith("SELECT"): print(cursor.fetchall()) except sqlite3.Error as error: print("에러 : ", error.args[0]) else: print("구문이 성공적으로 수행되었습니다.") buffer="" connection.close() print("프로그램을 종료합니다.") |
■ Connection 클래스의 iterdump 메소드를 사용해 데이터베이스 덤프를 만드는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
import sqlite3 connection = sqlite3.connect(":memory:") cursor = connection.cursor() cursor.execute("CREATE TABLE PHONE_BOOK (NAME TEXT, PHONE_NUMBER TEXT);") cursor.execute("INSERT INTO PHONE_BOOK VALUES ('Derick', '010-1234-5678');") cursor.execute("INSERT INTO PHONE_BOOK VALUES ('Tom' , '010-5432-7833');") cursor.execute("INSERT INTO PHONE_BOOK VALUES ('DSP' , '010-1234-9876');") with open("dump.sql", "w") as textIOWrapper: for line in connection.iterdump(): textIOWrapper.write("{0}\n".format(line)) """ BEGIN TRANSACTION; CREATE TABLE PHONE_BOOK (NAME TEXT, PHONE_NUMBER TEXT); INSERT INTO "PHONE_BOOK" VALUES('Derick','010-1234-5678'); INSERT INTO "PHONE_BOOK" VALUES('Tom','010-5432-7833'); INSERT INTO "PHONE_BOOK" VALUES('DSP','010-1234-9876'); COMMIT; """ |
■ Connection 클래스의 iterdump 메소드를 사용해 데이터베이스 덤프를 만드는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
import sqlite3 connection = sqlite3.connect(":memory:") cursor = connection.cursor() cursor.execute("CREATE TABLE PHONE_BOOK (NAME TEXT, PHONE_NUMBER TEXT);") cursor.execute("INSERT INTO PHONE_BOOK VALUES ('Derick', '010-1234-5678');") cursor.execute("INSERT INTO PHONE_BOOK VALUES ('Tom' , '010-5432-7833');") cursor.execute("INSERT INTO PHONE_BOOK VALUES ('DSP' , '010-1234-9876');") for line in connection.iterdump(): print(line) """ BEGIN TRANSACTION; CREATE TABLE PHONE_BOOK (NAME TEXT, PHONE_NUMBER TEXT); INSERT INTO "PHONE_BOOK" VALUES('Derick','010-1234-5678'); INSERT INTO "PHONE_BOOK" VALUES('Tom','010-5432-7833'); INSERT INTO "PHONE_BOOK" VALUES('DSP','010-1234-9876'); COMMIT; """ |
■ 파이썬 데이터 타입을 사용해 테이블을 생성하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
import sqlite3 connection = sqlite3.connect(":memory:") cursor = connection.cursor() cursor.execute("CREATE TABLE TABLE1 (NAME TEXT, AGE INTEGER, MONEY REAL);") cursor.execute("CREATE TABLE TABLE2 (NAME str, AGE int, MONEY float);") cursor.execute("INSERT INTO TABLE1 VALUES ('Tiger', 25, 123.45);") cursor.execute("INSERT INTO TABLE2 VALUES ('Tiger', 25, 123.45);") cursor.execute("SELECT * FROM TABLE1") for rowTuple in cursor: print(rowTuple) print() cursor.execute("SELECT * FROM TABLE2") for rowTuple in cursor: print(rowTuple) """ ('Tiger', 25, 123.45) ('Tiger', 25, 123.45) """ |
■ 커스텀 데이터 타입을 사용하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
import sqlite3 # 사용자 정의 자료형 class Point(object): def __init__(self, x, y): self.x = x self.y = y def __repr__(self): return "Point(%f, %f)" % (self.x, self.y) # 사용자 정의 자료형에서 SQlite3 입력 가능한 자료형으로 변환한다. def PointAdapter(point): return "%f:%f" % (point.x, point.y) # SQLite3에서 조회한 결과를 사용자 정의 자료형으로 변환한다. def PointConverter(source): x, y = list(map(float, source.decode().split(":"))) return Point(x, y) # SQLite3에서 어댑터와 변환자를 등록한다. sqlite3.register_adapter(Point, PointAdapter) sqlite3.register_converter("point", PointConverter) point1 = Point( 4, -3.2) point2 = Point(-1.4, 6.2) # detect_types 인자를 sqlite3.PARSE_DECLTYPES로 설정하여 암묵적으로 선언된 자료형으로 조회하도록 설정한다. connection = sqlite3.connect(":memory:", detect_types = sqlite3.PARSE_DECLTYPES) cursor = connection.cursor() cursor.execute("CREATE TABLE TABLE1 (LOCATION POINT);") cursor.execute("INSERT INTO TABLE1 VALUES (?);", (point1, )) cursor.execute("INSERT INTO TABLE1 VALUES (?);", (point2, )) cursor.execute("SELECT * FROM TABLE1") for rowTuple in cursor: print(rowTuple) print() """ (Point(4.000000, -3.200000),) (Point(-1.400000, 6.200000),) """ |
■ Connection 클래스의 create_aggregate 메소드를 사용해 커스텀 집계 함수를 정의하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
import sqlite3 class Average: def __init__(self): self.summary = 0 self.count = 0 def step(self, value): self.summary += value self.count += 1 def finalize(self): return self.summary / self.count connection = sqlite3.connect(":memory:") connection.create_aggregate("average", 1, Average) cursor = connection.cursor() cursor.execute("CREATE TABLE PHONE_BOOK (NAME TEXT, AGE INTEGER);") tuple1 = (("Tom", 24), ("Derick", 30), ("Peter", 53), ("Jane", 29)) cursor.executemany("INSERT INTO PHONE_BOOK VALUES (?, ?);", tuple1) cursor.execute("SELECT AVERAGE(AGE) FROM PHONE_BOOK;") for rowTuple in cursor: print(rowTuple) """ (34.0,) """ |
■ SQlite3 내장 집계 함수를 사용하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
import sqlite3 connection = sqlite3.connect(":memory:") cursor = connection.cursor() cursor.execute("CREATE TABLE PHONE_BOOK (NAME TEXT, AGE INTEGER);") tuple1 = (("Tom", 24), ("Derick", 30), ("Peter", 53), ("Jane", 29)) cursor.executemany("INSERT INTO PHONE_BOOK VALUES (?, ?);", tuple1) cursor.execute("SELECT LENGTH(NAME), UPPER(NAME), LOWER(NAME) FROM PHONE_BOOK;") for rowTuple in cursor: print(rowTuple) print() cursor.execute("SELECT MAX(AGE), MIN(AGE), SUM(AGE) FROM PHONE_BOOK;") for rowTuple in cursor: print(rowTuple) print() cursor.execute("SELECT COUNT(*), RANDOM(*) FROM PHONE_BOOK;") for rowTuple in cursor: print(rowTuple) """ (3, 'TOM', 'tom') (6, 'DERICK', 'derick') (5, 'PETER', 'peter') (4, 'JANE', 'jane') (53, 24, 136) (4, -1899594893834596166) """ |
■ Connection 클래스의 create_collation 메소드를 사용해 사용자 정렬 함수를 설정하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
import sqlite3 def CustomOrder(source1, source2): target1 = source1.upper() target2 = source2.upper() return (target1 > target2) - (target1 < target2) connection = sqlite3.connect("test.db") connection.isolation_level = None connection.create_collation("CustomOrder", CustomOrder) cursor = connection.cursor() cursor.execute("CREATE TABLE PHONE_BOOK (NAME TEXT, PHONE_NUMBER TEXT);") cursor.execute("INSERT INTO PHONE_BOOK VALUES ('DSP' , '010-123-1234' );") cursor.execute("INSERT INTO PHONE_BOOK VALUES ('Derick' , '010-1234-5678');") cursor.execute("INSERT INTO PHONE_BOOK VALUES ('Sangjung', '010-5670-2343');") cursor.execute("INSERT INTO PHONE_BOOK VALUES ('Tom' , '010-543-5432' );") cursor.execute("INSERT INTO PHONE_BOOK VALUES ('apple' , '010-369-3639' );") cursor.execute("SELECT * FROM PHONE_BOOK ORDER BY NAME COLLATE CustomOrder;") rowTupleList = cursor.fetchall() for rowTuple in rowTupleList: print(rowTuple) """ ('apple', '010-369-3639') ('Derick', '010-1234-5678') ('DSP', '010-123-1234') ('Sangjung', '010-5670-2343') ('Tom', '010-543-5432') """ |
■ Connection 클래스의 isolation_level 속성을 사용해 자동 커밋 모드를 설정하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
import sqlite3 connection = sqlite3.connect("test.db") connection.isolation_level = None cursor = connection.cursor() cursor.execute("CREATE TABLE PHONE_BOOK (NAME TEXT, PHONE_NUMBER TEXT);") cursor.execute("INSERT INTO PHONE_BOOK VALUES ('Derick', '010-1234-5678');") cursor.execute("SELECT * FROM PHONE_BOOK;") print(cursor.fetchone()) |
■ Connection 클래스의 commit/rollback 메소드를 사용해 트랜잭션을 처리하는 방법을 보여준다. ▶ 예제 코드 (PY)
|
import sqlite3 connection = sqlite3.connect("test.db") cursor = connection.cursor() cursor.execute("CREATE TABLE PHONE_BOOK (NAME TEXT, PHONE_NUMBER TEXT);") try: cursor.execute("INSERT INTO PHONE_BOOK VALUES ('Derick', '010-1234-5678');") connection.commit() except: connection.rollback() |
■ Cursor 클래스의 fetchall 메소드를 사용해 모든 레코드를 가져오는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
import sqlite3 connection = sqlite3.connect(":memory:") cursor = connection.cursor() cursor.execute("CREATE TABLE PHONE_BOOK (NAME TEXT, PHONE_NUMBER TEXT);") sql = "INSERT INTO PHONE_BOOK VALUES (?, ?);" parameterTupleTuple = \ ( ("Derick", "010-1234-5678"), ("Tom" , "010-5432-5432"), ("DSP" , "010-1234-1234") ) cursor.executemany(sql, parameterTupleTuple) cursor.execute("SELECT * FROM PHONE_BOOK;") rowTupleList = cursor.fetchall() for rowTuple in rowTupleList: print(rowTuple) """ ('Derick', '010-1234-5678') ('Tom', '010-5432-5432') ('DSP', '010-1234-1234') """ |
■ Cursor 클래스의 fetchmany 메소드를 사용해 레코드 N건을 가져오는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
import sqlite3 connection = sqlite3.connect(":memory:") cursor = connection.cursor() cursor.execute("CREATE TABLE PHONE_BOOK (NAME TEXT, PHONE_NUMBER TEXT);") sql = "INSERT INTO PHONE_BOOK VALUES (?, ?);" parameterTupleTuple = \ ( ("Derick", "010-1234-5678"), ("Tom" , "010-5432-5432"), ("DSP" , "010-1234-1234") ) cursor.executemany(sql, parameterTupleTuple) cursor.execute("SELECT * FROM PHONE_BOOK;") rowTupleList = cursor.fetchmany(2) for rowTuple in rowTupleList: print(rowTuple) """ ('Derick', '010-1234-5678') ('Tom', '010-5432-5432') """ |
■ Cursor 클래스의 fetchone 메소드를 사용해 레코드 1건을 가져오는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
import sqlite3 connection = sqlite3.connect(":memory:") cursor = connection.cursor() cursor.execute("CREATE TABLE PHONE_BOOK (NAME TEXT, PHONE_NUMBER TEXT);") sql = "INSERT INTO PHONE_BOOK VALUES (?, ?);" parameterTupleTuple = \ ( ("Derick", "010-1234-5678"), ("Tom" , "010-5432-5432"), ("DSP" , "010-1234-1234") ) cursor.executemany(sql, parameterTupleTuple) cursor.execute("SELECT * FROM PHONE_BOOK;") rowTuple = cursor.fetchone() print(rowTuple) """ ('Derick', '010-1234-5678') """ |
■ Cursor 클래스의 executescript 메소드를 사용해 SQL문을 실행하는 방법을 보여준다. ▶ script.sql
|
CREATE TABLE PHONE_BOOK (NAME TEXT, PHONE_NUMBER TEXT); INSERT INTO PHONE_BOOK VALUES ("Derick", "010-1234-5678"); |
▶ main.py
|
import sqlite3 with open("script.sql") as f: script = f.read() connection = sqlite3.connect(":memory:") cursor = connection.cursor() cursor.executescript(script) |
■ Cursor 클래스를 사용해 레코드를 조회하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
import sqlite3 connection = sqlite3.connect(":memory:") cursor = connection.cursor() cursor.execute("CREATE TABLE PHONE_BOOK (NAME TEXT, PHONE_NUMBER TEXT);") sql = "INSERT INTO PHONE_BOOK VALUES (?, ?);" parameterTupleTuple = \ ( ("Derick", "010-1234-5678"), ("Tom" , "010-5432-5432"), ("DSP" , "010-1234-1234") ) cursor.executemany(sql, parameterTupleTuple) cursor.execute("SELECT * FROM PHONE_BOOK;") for rowTuple in cursor: print(rowTuple) """ ('Derick', '010-1234-5678') ('Tom', '010-5432-5432') ('DSP', '010-1234-1234') """ |
■ Cursor 클래스의 executemany 메소드 사용시, generator 객체를 사용해 SQL문 인자를 전달하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
import sqlite3 def GetGenerator(): parameterTupleTuple = (("Tom", "010-543-5432"), ("DSP", "010-123-1234")) for parameterTuple in parameterTupleTuple: yield parameterTuple connection = sqlite3.connect(":memory:") cursor = connection.cursor() cursor.execute("CREATE TABLE PHONE_BOOK (NAME TEXT, PHONE_NUMBER TEXT);") sql = "INSERT INTO PHONE_BOOK VALUES (?, ?);" generator1 = GetGenerator() cursor.executemany(sql, generator1) |
■ Cursor 클래스의 executemany 메소드를 사용해 SQL문을 연속 실행하는 방법을 보여준다. ▶ 예제 코드 (PY)
|
import sqlite3 connection = sqlite3.connect(":memory:") cursor = connection.cursor() cursor.execute("CREATE TABLE PHONE_BOOK (NAME TEXT, PHONE_NUMBER TEXT);") sql = "INSERT INTO PHONE_BOOK VALUES (?, ?);" parameterTupleTuple = (("Tom", "010-543-5432"), ("DSP", "010-123-1234")) cursor.executemany(sql, parameterTupleTuple) |
■ Cursor 클래스의 execute 메소드 사용시 SQL문 인자를 전달하는 방법을 보여준다. ▶ 예제 코드 (PY)
|
import sqlite3 connection = sqlite3.connect(":memory:") cursor = connection.cursor() cursor.execute("CREATE TABLE PHONE_BOOK (NAME TEXT, PHONE_NUMBER TEXT);") sql = "INSERT INTO PHONE_BOOK VALUES (:name, :phoneNumber);" parameterDictionary = {"name" : "Derick", "phoneNumber" : "010-1234-5678"} cursor.execute(sql, parameterDictionary) |
■ Cursor 클래스의 execute 메소드 사용시 SQL문 인자를 전달하는 방법을 보여준다. ▶ 예제 코드 (PY)
|
import sqlite3 connection = sqlite3.connect(":memory:") cursor = connection.cursor() cursor.execute("CREATE TABLE PHONE_BOOK (NAME TEXT, PHONE_NUMBER TEXT);") sql = "INSERT INTO PHONE_BOOK VALUES (?, ?);" parameterTuple = ("Derick", "010-1234-5678") cursor.execute(sql, parameterTuple) |
■ connect 함수를 사용해 메모리 데이터베이스를 연결하는 방법을 보여준다. ▶ 예제 코드 (PY)
|
import sqlite3 connection = sqlite3.connect(":memory:") |
■ Cursor 클래스의 execute 메소드를 사용해 SQL문을 실행하는 방법을 보여준다. ▶ 예제 코드 (PY)
|
import sqlite3 connection = sqlite3.connect(":memory:") cursor = connection.cursor() cursor.execute("CREATE TABLE PHONE_BOOK (NAME TEXT, PHONE_NUMBER TEXT);") cursor.execute("INSERT INTO PHONE_BOOK VALUES ("Derick", "010-1234-5678");") |
■ connect 함수를 사용해 데이터베이스 파일을 연결하는 방법을 보여준다. ▶ 예제 코드 (PY)
|
import sqlite3 connection = sqlite3.connect("sample.db") |