2023년 7월 31일 월요일

sql limit 를 이용해 page 단위로 보여주기

 SQL 에서 limit 는 SELECT 와 함께 아래와 같이 사용되어 집니다.

SELECT column FROM table ORDER BY somethingelse LIMIT 25, 50

select 되는 개수가 많을 수도 있습니다. 이때 page 단위로 얻을 수 있는 방법이 LIMIT를 이용하게 됩니다.

LIMIT [페이지 번호], [페이지당 결과 값의 갯수]

LIMIT 의 첫번째 값은 몇번째 페이지를 나타낼지를 뒤에 값은 페이지의 갯수를 의미합니다.

만약 인자가 하나라면 결과 값의 갯수가 제한되는 형태가 됩니다.

LIMIT [결과 값의 갯수]


예를 들어 살펴 보겠습니다.

아래 예제는 page_size와 page_number를 입력받아서 해당 페이지에 있는 dict_key를 list형태로 전달하는 함수입니다.

# 페이지 단위로 데이터를 얻는다.
# asc : True 이면 오래된 데이터 순으로 나온다.
def get_page_keys(self, page_number, page_size, asc=False):
if not self.is_connect:
self.connect()
cursor = self.con.cursor()
asc_str = "DESC"
page_from = page_size * page_number
if asc:
asc_str = "ASC"
try:
cursor.execute(f"SELECT dict_key FROM '{self.table_name}' ORDER BY timestamp {asc_str} LIMIT {page_from}, {page_size}")
except sqlite3.OperationalError as ex:
if str(ex).startswith("no such table:"):
cursor.close()
return None, None
rows = cursor.fetchall()
cursor.close()
if rows is None:
return None, None
ret = []
# print("debug:",rows)
for row in rows:
ret.append(row[0])
return ret


전체 예제는 아니지만 아래와 같이 실행시

sd.save_dict({"a": 1}, dupkey_process="forced")
time.sleep(0.1) # 시간 정보를 빼면 입력한 시간이 같아지는 경우가 발생하여 순서가 섞일 수 있음
sd.save_dict({"b": 2}, dupkey_process="forced")
time.sleep(0.1)
sd.save_dict({"c": 3}, dupkey_process="forced")
time.sleep(0.1)
sd.save_dict({"d": 4}, dupkey_process="forced")
time.sleep(0.1)
sd.save_dict({"e": 5}, dupkey_process="forced")
time.sleep(0.1)
sd.save_dict({"f": 6}, dupkey_process="forced")
time.sleep(0.1)
sd.save_dict({"g": 7}, dupkey_process="forced")

print("get_page_keys 0", sd.get_page_keys(0, 3))
print("get_page_keys 1", sd.get_page_keys(1, 3))
print("get_page_keys 2", sd.get_page_keys(2, 3))
print("get_page_keys 3", sd.get_page_keys(3, 3))

print("get_page_keys 0 asc", sd.get_page_keys(0, 3, asc=True))
print("get_page_keys 1 asc", sd.get_page_keys(1, 3, asc=True))
print("get_page_keys 2 asc", sd.get_page_keys(2, 3, asc=True))
print("get_page_keys 3 asc", sd.get_page_keys(3, 3, asc=True))

다음의 결과를 얻을 수 있습니다.

get_page_keys 0 ['g', 'f', 'e']
get_page_keys 1 ['d', 'c', 'b']
get_page_keys 2 ['a']
get_page_keys 3 []
get_page_keys 0 asc ['a', 'b', 'c']
get_page_keys 1 asc ['d', 'e', 'f']
get_page_keys 2 asc ['g']
get_page_keys 3 asc []

위 예제에서는 page 크기를 3으로 설정했으므로 list에 3개씩 결과가 돌아옴을 알 수 있습니다.

전체예제는 github 소스를 참고하시기 바랍니다.

sourcecode/python/example/_46_sqlite/dict_sqlite.py at main · donarts/sourcecode · GitHub


댓글 없음:

댓글 쓰기