๊ผผ๊ผผํ ๊ฒ ์ข์ง๋ง์ ์์ ๊ฒ ๊ฐ๋ค. '์ง๊ธ ๋์ถฉ ๊ตฌํํ๋ฉด ๋์ค์ ๋ฌด์จ ๋ฌธ์ ๋ผ๋ ์๊ธฐ์ง ์์๊น?' ํ๋ ์๊ฐ์ ๋ณธ์ธ ๋๋ฆ๋๋ก ๊ผผ๊ผผํ ๊ตฌํํด๋๋ฉด, ์คํ๋ ค ๊ทธ๊ฒ ๋์ค์ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์ง๊ธ ๋ด๊ฐ ๊ฒช์ ์ผ์ด ๋ฑ ์ด๋ฐ ๊ฒฝ์ฐ๋ค. ํ ๋ฌ ์ ๋ ์ ์ธ๊ฐ? ์ด๋ค ๋ชจ๋ธ์ ๋ํ๋ด๋ ๊ด๊ณํ ์คํค๋ง๋ฅผ ์ ์ํ ์ผ์ด ์์๋ค. (์ฌ์ค SQLAlchemy๋ฅผ ์ฌ์ฉํ์๊ธฐ ๋๋ฌธ์ ๊ด๊ณํ ์คํค๋ง๋ฅผ ์ง์ ์ ์ํ์ง ์์๋ค.) ์ด ๋ชจ๋ธ์๋ ๊ฐ์ฒด๊ฐ ๋์ค์ ์์นํ ์๋ก ๋ ํฐ ์์ ์ ์๋ฅผ ๊ฐ๋ ์์๊ฐ ์์ฑ์ด ์์๋ค.
์คํค๋ง๋ฅผ ์ ์ํ๋ฉด์, ๋๋ ์ด๋ฐ ์๊ฐ์ ํ๋ค. '์ฌ๋ฌ ๊ฐ์ฒด๊ฐ ๋์ผํ ์์๊ฐ์ ๊ฐ์ง๋ฉด ๋์ค์ ๊ฐ์ฒด๋ค์ ์์๋๋ก ๋์ดํ ๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ผ๋๊น, ์์๊ฐ์ ๋ํ๋ด๋ ์ปฌ๋ผ์ UNIQUE constraint๋ฅผ ๊ฑธ์ด๋๋ ๊ฒ ์ข๊ฒ ์ด.' ๊ทธ๋์, ๊ฑธ์๋ค. ๋ณ ๋ฌธ์ ๊ฐ ์์๋ค. ๊ฐ์ฒด๋ค์ ์์๋ฅผ ๋ณ๊ฒฝํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ ๊น์ง.
์ผ๋ง ์ ์ ์ด ๋ชจ๋ธ์ ๊ฐ์ฒด๋ค์ ๋ค๋ฃจ๋ ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ๊ตฌํํ๊ธฐ ์์ํ๋๋ฐ, ์๋ก ์์ฑ๋๋ ๊ฐ์ฒด๊ฐ ๋งจ ์์ ์์นํ๋๋ก ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ๊ตฌํํด์ผ ํ๋ค. ๊ทธ๋์ ์๋ก์ด ๊ฐ์ฒด์ ์์๊ฐ์ 1๋ก ์ค์ ํ๊ณ , ๊ธฐ์กด์ ์กด์ฌํ๋ ๋ชจ๋ ๊ฐ์ฒด๋ค์ ์์๊ฐ์ 1์ฉ ์ฆ๊ฐํ๋๋ก ์ฝ๋๋ฅผ ์์ฑํ์๋ค. ๋์ถฉ ์๋์ ๊ฐ๋ค.
query.filter(pos_col >= new_pos) \ .update({pos_col: pos_col + 1}, synchronize_session=False)
๊ทธ๋ฐ๋ฐ ์ฝ๋๊ฐ ์ ๋๋ก ์๋ํ์ง ์์๋ค. DB์ ์ ์ฅ๋ ์์๊ฐ์ด 1, 2, 3, 4, ... ์ ๊ฐ์ด ์ธ์ ํ ์ ์๋ค์ธ ๊ฒฝ์ฐ์ ์ค๋ณต๋ ํค ๊ฐ์ด ์กด์ฌํ๋ค๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด์๋ค.
ํด๊ฒฐ์ฑ
์ ๊ณ ๋ฏผํด ๋ณด์๋ค. ๊ธฐ์กด์ ๊ฐ์ฒด๋ค์ ์์๊ฐ ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ ๋ค์์, ์์๊ฐ์ ํ๋์ฉ ์ฆ๊ฐ์ํค๊ณ , ํธ๋์ญ์
์ ๋ง์น๊ณ , ์์๊ฐ์ ํ๋์ฉ ์ฆ๊ฐ์ํค๊ณ , ํธ๋์ญ์
์ ๋ง์น๊ณ , ...๋ฅผ ๋ฐ๋ณตํ๋ฉด ์ด๋จ๊น? ์ฟผ๋ฆฌ๊ฐ ๋๋ฌด ๋ง์ด ๋ฐ์ํ๋ค.
์๊ณ ๋ณด๋ UPDATE ๋ฌธ์๋ ORDER BY ์ ์ ์ฌ์ฉํ ์ ์๋ค๊ณ ํ๋ค. ๊ทผ๋ฐ SQLAlchemy์์ ์ง์์ ์ ํ๋ค. ํ. ๊ทธ๋ ๋ค๊ณ raw query๋ฅผ ๋ ๋ฆฌ์๋ ์ ์ฐ์ฐํ๊ณ .
๊ฒฐ๊ตญ ์คํค๋ง๋ฅผ ์ ์ํ ๋์ ๊ฑธ์ด๋ UNIQUE constraint๋ฅผ ์ง์ฐ๋ ๊ฒ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์๋ค. ๋ญ... ๊ทธ๋ฌ๋ค.
๊ทธ๋ฌ๋๊น ๊ฒฐ๊ตญ, '๊ผผ๊ผผํ๊ฒ' ์์
์ ํ๊ณ ์ถ์ผ๋ฉด ์ง์ง ๊ผผ๊ผผํ๊ฒ ํ๋ ์ง, ์์ ์ด ์์ผ๋ฉด ์ ๋นํ ํด์ ์๊ฐ์ ์๋ผ๋ ์ง ํ๋ ๊ฒ ์ข์ง ์์๊น ์ถ๋ค.