Gidhub BE Developer

트랜잭션, 정렬

2018-02-10
goodGid

트랜잭션 처리

[1]

import sqlite3

con = sqlite3.connect("./test.db")
cur = con.cursor()
cur.execute("CREATE TABLE PhoneBook(Name text, PhoneNum text);")
cur.execute("INSERT INTO PhoneBook VALUES('GoodGid1','010-1');")
cur.execute("INSERT INTO PhoneBook VALUES('GoodGid2','010-2');")
cur.execute("INSERT INTO PhoneBook VALUES('GoodGid2','010-3');")
cur.execute("INSERT INTO PhoneBook VALUES('GoodGid4','010-4');")

cur.execute("SELECT * FROM PhoneBook;")
print(cur.fetchall())


[('GoodGid1', '010-1'), ('GoodGid2', '010-2'), ('GoodGid2', '010-3'), ('GoodGid4', '010-4')]

[2]

import sqlite3

con = sqlite3.connect("./test.db")
cur = con.cursor()
cur.execute("SELECT * FROM PhoneBook;")
print(cur.fetchall())



[]

  • [1]과 [2]의 차이는 pysqlite 트랜잭션 처리와 연관되어 있다.

  • 해결법으로는 Connection.commit()을 호출하면 수행한 SQL 구문을 DB에 반영할 수 있다.

[1]

import sqlite3

con = sqlite3.connect("./test.db")
cur = con.cursor()
cur.execute("CREATE TABLE PhoneBook(Name text, PhoneNum text);")
cur.execute("INSERT INTO PhoneBook VALUES('GoodGid1','010-1');")
cur.execute("INSERT INTO PhoneBook VALUES('GoodGid2','010-2');")
cur.execute("INSERT INTO PhoneBook VALUES('GoodGid2','010-3');")
cur.execute("INSERT INTO PhoneBook VALUES('GoodGid4','010-4');")

con.commit()                # cur이 아니라 con이다 !
cur.execute("SELECT * FROM PhoneBook;")

[2]

import sqlite3

con = sqlite3.connect("./test.db")
cur = con.cursor()

cur.execute("SELECT * FROM PhoneBook;")
print(cur.fetchall())




[('GoodGid1', '010-1'), ('GoodGid2', '010-2'), ('GoodGid2', '010-3'), ('GoodGid4', '010-4')]
  • [1]에서 commit()을 한 후 [2]에서 SELECT을 하게 되면 원하는 결과값을 확일할 수 있다.

  • 이와 같이 commit()을 호출하지 않고 DB에 반영하기 위해 자동 커밋 모드를 설정할 수 있다.

con.isolation_level = None

레코드 정렬과 사용자 정렬 함수

cur.execute("SELECT * FROM PhoneBook ORDER BY Name DESC;")
print ([ r for r in cur ])

[('b_GoodGid2', '010-2'), ('a_GoodGid1', '010-1'), ('D_GoodGid4', '010-4'), ('C_GoodGid2', '010-3')]




print ([ r[0] for r in cur ])
['b_GoodGid2', 'a_GoodGid1', 'D_GoodGid4', 'C_GoodGid2']


print ([ r[1] for r in cur ])
['010-2', '010-1', '010-4', '010-3']
  • 만약 [소문자->대문자] 순서가 아닌 [대문자->소문자]로 정렬을 하고 싶을 땐 사용자 정렬 함수를 정의하고 그 메소드를 이용한다.

  • Connection.create_collation() 메서드를 이용해 DB에 등록한 뒤, SELECT 문에서 이 정렬 방식을 명시적으로 지정해 처리할 수 있다.


def OrderFunc(str1, str2):
    s1 = str1.upper()
    s2 = str2.upper()
    return (s2 > s1) - (s2 < s1)

con.create_collation('myordering',OrderFunc)        # SQL 구문에서 호출할 이름과 함수를 등록
cur.execute("SELECT * FROM PhoneBook ORDER BY Name COLLATE myordering;") # QL 구문에서 정렬 규칙을 지정
print([r[0] for r in cur])



['D_GoodGid4', 'C_GoodGid2', 'b_GoodGid2', 'a_GoodGid1']

Back : DB

Comments

Content