SQLAlchemy 1.1 - index_property
SQLAlchemy 1.1์๋ index_property๋ผ๋, Indexable ์ปฌ๋ผ (JSON, ARRAY, HSTORE ๋ฑ)์ ์์ฑ ํ๋๋ฅผ ๋ง์น ์ปฌ๋ผ๊ณผ ๋น์ทํ ํ๋กํผํฐ์ฒ๋ผ ๋ค๋ฃฐ ์ ์๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ต๋๋ค.
์ ๊ฐ ์ถ๊ฐํ ๊ธฐ๋ฅ์ด๋ผ ์๊ฐ ์๊ฐ.
1.1์ ์ถ๊ฐ๋ ๊ฒ ์๊ฐ ๋ฌธ์์ Indexable์ ๊ดํ ๋ฌธ์๋ก ๋๋์ด์ ๋ค๋ฃจ์ด์ง๊ณ ์๋๋ฐ, ์ด ๊ธ์์๋ ๋ฌด์์ด ์ข์์ง 1.0์ ์ฝ๋์ ๋น๊ตํด ๋ณด๋ ค๊ณ ํฉ๋๋ค.
๋จผ์ id ๋ฐ์ ๋ชจ๋ ์๋ฃ๋ data๋ผ๋ JSON ์ปฌ๋ผ์ ์ ์ฅํ๋ ๋ชจ๋ธ Person์ ์๊ฐํด ๋ด ์๋ค.
class Person(Base): __tablename__ = 'person' id = Column(Integer, primary_key=True) data = Column(JSON) # ์ฌ๊ธฐ์ ๋ชจ๋ ์์ฑ์ด ๋ค์ด๊ฐ๋ค
๋ง์ผ data์ name์ด๋ผ๋ ์์ฑ์ด ๋ค์ด์๋ค๋ฉด, 1.0์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ๊ทผํฉ๋๋ค.
person = Person(data={'name': 'youknowone'}) # ๋ง๋ค ๋ print(person.data['name']) # ๊ฐ์ ธ์ฌ ๋
1.1์ ์๋ก ์ถ๊ฐ๋ index_property๋ ์ฌ๊ธฐ์ name์ ๋ง์น ํ๋์ ์ปฌ๋ผ๊ณผ ๋น์ทํ๊ฒ ๋ค๋ฃฐ ์ ์๋๋ก ๋์์ค๋๋ค.
class Person(Base): __tablename__ = 'person' id = Column(Integer, primary_key=True) data = Column(JSON) # ์ฌ๊ธฐ์ ๋ชจ๋ ์์ฑ์ด ๋ค์ด๊ฐ๋ค name = index_property('data', 'name')
์ฒ์ ์ ์์์ name์ด๋ผ๋ index_property๋ฅผ ์ถ๊ฐํ์ต๋๋ค. data๋ผ๋ ์ปฌ๋ผ์ name์ด๋ผ๋ ํค์ ์ฐ๊ฒฐ์ํจ ํ๋กํผํฐ๋ผ๋ ๋ป์ด์์.
์ด ํ๋กํผํฐ๋ ๋ง๋ฅ์ด์ด์, ์ฌ๋ฌ๋ถ์ด SQLAlchemy์์ ๊ธฐ์กด์ ํ๋กํผํฐ์ ๊ธฐ๋ํ๋ ๋ชจ๋ ์ผ์ ํ ์ ์์ด์.
person = Person(name='youknowone') # ์์ฑ assert person.name == 'youknowone' # ์กฐํ person.name = 'sqlalchemy' # ๋ณ๊ฒฝ session.query(Person).filter(Person.name.astext == 'sqlalchemy') # ์ฟผ๋ฆฌ
์ด๊ฒ๋ค์ ๋ค์ index_property ์์ด, 1.0๊ณผ ํธํ๋๋๋ก ์จ ๋ณธ๋ค๋ฉด,
class Person(Base): __tablename__ = 'person' id = Column(Integer, primary_key=True) data = Column(MutableDict.as_mutable(JSON)) # ์๊น์ ๋ฌ๋ฆฌ ๋ด์ฉ ๋ณ๊ฒฝ์ ์ถ์ ํ๋ ค๋ฉด MutableDict๋ก ํ์ ์ ๊ฐ์ธ์ฃผ์ด์ผ ํ๋ค. person = Person(data={'name': 'youknowone'}) # ์์ฑ assert person.data['name'] == 'youknowone' # ์กฐํ person.data['name'] = 'sqlalchemy' # ๋ณ๊ฒฝ. ์์์ MutableDict๋ฅผ ์จ์ผ๋ง ๊ฐ๋ฅ session.query(Person).filter(Person.data['name'].astext == 'sqlalchemy') # ์ฟผ๋ฆฌ
๊ฐ๊ฐ์ ์ฝ๋๊ฐ ํจ์ฌ ๊ธธ์ด์ง๋ ๊ฒ์ ๋ฌผ๋ก ์ด๊ณ MutableDict ์ญ์ ๋์ ํด์ ํจ๊ป ์จ์ผ ํฉ๋๋ค. ๋ฌผ๋ก 1.0์์๋ ์ด๊ฑธ ์ผ์ผ์ด ํ์ด์ฐ๊ธฐ ๋ณด๋ค๋ ๋น์ทํ ์ธํฐํ์ด์ค๋ก ๊ฐ์ธ์ ์ฐ๊ธฐ๋ค ์ํ๋ ์ฌ๋๋ค์ด ์์์ฃ . ์ด๋ฒ์๋ ์ด ํ๋กํผํฐ๋ฅผ ์ง์ ๋ง๋ค์ด ๋ด ์๋ค.
class Person(Base): __tablename__ = 'person' id = Column(Integer, primary_key=True) data = Column(JSON) # ์ฌ๊ธฐ์ ๋ชจ๋ ์์ฑ์ด ๋ค์ด๊ฐ๋ค @hybrid_property def name(self): return self.data.get('name', None) @name.setter def name(self, new_value): data = self.data.copy() # ๊ผญ ๋ณต์ฌํ ํ์๋ ์์ง๋ง name์ ๋ฐ๋ก ๋์ ํ๋ฉด ๋ณ๊ฒฝ์ ์ถ์ ํ์ง ๋ชปํด์ data['name'] = new_value self.data = data @name.expression def name(self): return self.data['name']
ํ ์ค์ index_property๋ก ๊ฐ๋ฅํ๋ ์ผ์ ์ธ ๊ฐ์ ๋ฉ์๋๋ฅผ ๊ตฌํํด ๊ฐ๋ฉฐ ๋ง๋ค์ด์ผ๋ง ํฉ๋๋ค. ์์์ด ๊บพ์ด๋ ์ผ์ด์ง์. ๊ทธ๋ฌ๋ ์์ผ๋ก๋ index_property๋ฅผ ๊ผญ ์ฐ์ธ์.
์ธ์ค ์์ฝ:
SQLAlchemy 1.1์๋ index_property๋ผ๋๊ฒ ์๊ฒผ๋ค.
index_property๋ฅผ ์ฐ๋ฉด JSON, ARRAY ๋ฑ์ ํ index๋ฅผ ๊ฐ๋ฆฌํค๋ ํ๋กํผํฐ๋ฅผ ๋ง๋ค ์ ์๋ค.
๋ง๋ค๊ณ ๋๋ฉด ๋ง์น ๊ทธ ์ด๋ฆ์ ์ปฌ๋ผ์ธ ๊ฒ๊ณผ ๋น์ทํ๊ฒ ์ธ ์ ์๋ค.











