파이썬코딩

파이썬코드 SQL 표현식 언어

다음 레벨 업은 SQLlchemy의 SQL 표현 언어입니다. 다양한 작업을 위한 SQL 생성 기능을 소개합니다. 표현식 언어는 하위 엔진 계층보다 더 많은 SQL 방언 차이를 처리합니다. 관계형 데이터베이스 애플리케이션에 편리한 중간 접근 방식이 될 수 있습니다.

다음은 동물원 테이블을 만들고 채우는 방법입니다. 다시 말하지만, 이것들은 단일 프로그램의 연속된 조각들입니다.

가져오기 및 연결은 이전과 동일합니다.

 

>>> import sqlalchemy as sa
>>> conn = sa.create_engine('sqlite://') 

동물원 테이블을 정의하기 위해 SQL 대신 표현식 언어 중 일부를 사용하기 시작합니다.

 

  >>> meta = sa.MetaData()

    >>> zoo = sa.Table('zoo', meta,

  •     ...      sa.Column('critter', sa.String, primary_key=True),
  •  
  •     ...      sa.Column('count', sa.Integer),
  •  
  •     ...      sa.Column('damages', sa.Float)
  •     ...    )
  •     >>> meta.create_all(conn)
  •  

앞의 예에서 여러 줄 통화의 괄호를 확인하십시오. 표() 메서드의 구조는 표 구조와 일치합니다. 표에 세 개의 열이 있는 것처럼 표() 메서드 호출의 괄호 안에 열()에 대한 세 개의 호출이 있습니다.

한편, zoo는 SQL 데이터베이스 세계와 파이썬 데이터 구조 세계를 연결하는 마법의 객체입니다.

표현 언어 함수가 더 많은 데이터를 삽입합니다.

 

 ... conn.execute(zoo.insert(('bear', 2, 1000.0)))

    <sqlalchemy.engine.result.ResultProxy object at 0x1017ea910>

    >>> conn.execute(zoo.insert(('weasel', 1, 2000.0)))

    <sqlalchemy.engine.result.ResultProxy object at 0x1017eab10>

    >>> conn.execute(zoo.insert(('duck', 10, 0)))

    <sqlalchemy.engine.result.ResultProxy object at 0x1017eac50>

 

그런 다음 SELECT 문을 만듭니다(zoo.select()). 예를 들어, SELECT * FROM ZOO가 일반 SQL에서 수행하는 것과 같이 동물원 개체가 나타내는 테이블에서 모든 것을 선택합니다.

 

>>> result = conn.execute(zoo.select()) 

마지막으로 다음과 같은 결과를 얻습니다.

>>> rows = result.fetchall()
>>> print(rows)
[('bear', 2, 1000.0), ('weasel', 1, 2000.0), ('duck', 10, 0.0)] 

객체-상대 매퍼

마지막 섹션에서 zoo 객체는 SQL과 파이썬 간의 중간 수준 연결이었다. SQLlchemy의 최상위 계층에서 ORM(Object-Relational Mapper)은 SQL 표현 언어를 사용하지만 실제 데이터베이스 메커니즘을 보이지 않게 하려고 합니다. 클래스를 정의하면 ORM이 데이터베이스로 데이터를 가져오거나 내보내는 방법을 처리합니다. "객체-관계형 맵퍼"라는 복잡한 구절 뒤에 숨겨진 기본 개념은 여러분이 코드에 있는 객체를 참조할 수 있고, 따라서 관계형 데이터베이스를 사용하면서 파이썬이 동작하는 방식에 근접할 수 있다는 것입니다.

 

동물원 클래스를 정의해서 ORM에 연결하겠습니다. 이번에는 SQLite에서 zoo.db 파일을 사용하도록 하여 ORM이 작동했는지 확인합니다.

 

앞의 두 절에서와 같이, 다음에 나오는 토막글은 실제로 설명으로 구분된 하나의 프로그램입니다. 이해가 안 가더라도 걱정하지 마세요. SQLArchemy 문서에는 모든 세부 사항이 포함되어 있습니다. 이 내용은 복잡해질 수 있습니다. 이 장에서 논의한 접근 방식 중 자신에게 적합한 방법을 결정할 수 있도록 이 작업을 수행하는 데 얼마나 많은 작업이 필요한지 파악해 주시기 바랍니다.

초기 가져오기는 동일하지만 이번에는 다른 것도 필요합니다.

 

>>> import sqlalchemy as sa
>>> from sqlalchemy.ext.declarative import declarative_base 

여기, 우리는 다음과 같은 연결을 만듭니다.

 

 >>> conn = sa.create_engine('sqlite:///zoo.db')

 

이제 SQLArchemy의 ORM에 대해 알아보겠습니다. Zoo 클래스를 정의하고 해당 속성을 테이블 열과 연결합니다.

 

>>> Base = declarative_base() >>> class Zoo(Base): 

  •     ...      __tablename__ = 'zoo'
  •  
  •     ...      critter = sa.Column('critter', sa.String, primary_key=True)
  •  
  •     ...      count = sa.Column('count', sa.Integer)
  •  
  •     ...      damages = sa.Column('damages', sa.Float)
  •  
  • ...  def __init__(self, critter, count, damages):
  •     ...          self.critter = critter
  •  
  •     ...          self.count = count
  •  
  •     ...          self.damages = damages
  •  
  • ...  def __repr__(self):
  • ...  return "<Zoo({}, {}, {})>".format(self.critter, self.count, self.damages) 
  •  
  • 다음 행은 데이터베이스와 테이블을 마법처럼 작성합니다.
  • >>> Base.metadata.create_all(conn)

  • 그런 다음 파이썬 개체를 만들어 데이터를 삽입할 수 있습니다. ORM은 이러한 것들을 관리한다.
  • 내부:
  •  
  • >>> first = Zoo('duck', 10, 0.0)
  •     >>> second = Zoo('bear', 2, 1000.0)
  •     >>> third = Zoo('weasel', 1, 2000.0)
  •     >>> first
  •     <Zoo(duck, 10, 0.0)>
  •  
  • 다음으로, 우리는 ORM이 우리를 SQL 랜드로 데려가게 합니다. 데이터베이스와 대화하기 위한 세션을 만듭니다.
  •  
  • . >>> from sqlalchemy.orm import sessionmaker >>> Session = sessionmaker(bind=conn)
    >>> session = Session()
  • 세션 내에서, 우리는 우리가 만든 세 개의 객체를 데이터베이스에 작성합니다. add() 함수는 하나의 객체를 추가하고 add_all()은 목록을 추가합니다.
  • .
  •   >>> session.add(first)
  •     >>> session.add_all([second, third])
  •  

  • 마지막으로, 우리는 모든 것을 완료하도록 강요해야 합니다.
  • >>> session.commit()

효과가 있던가요? 현재 디렉터리에 zoo.db 파일을 만들었습니다. 사용할 수 있습니다.

확인할 명령줄 sqlite3 프로그램:

 

  • $ sqlite3 zoo.db
    SQLite version 3.6.12
    Enter ".help" for instructions
    Enter SQL statements terminated with a ";" sqlite> .tables
    zoo
    sqlite> select * from zoo; 
  • duck|10|0.0

bear|2|1000.0

 

 weasel|1|2000.0

 

이 섹션의 목적은 ORM이 무엇이고 높은 수준에서 어떻게 작동하는지 보여주기 위한 것이다. SQLlchemy의 작성자가 전체 자습서를 작성했습니다. 이 내용을 읽은 후 다음 중 필요에 가장 적합한 수준을 결정하십시오.

 

• 이전 SQLite 섹션에서와 같이 일반 DB-API

 

• SQLArchemy 엔진룸

 

• SQLArchemy 표현 언어

 

• SQLChemy ORM

 

SQL의 복잡성을 피하기 위해 ORM을 사용하는 것은 자연스러운 선택인 것 같습니다. 하나 쓸까요? 어떤 사람들은 ORM을 피해야 한다고 생각하지만, 다른 사람들은 이 비판이 지나치다고 생각한다. 누가 옳든, ORM은 추상화입니다. 그리고 모든 추상화들은 어느 순간 무너집니다. 그것들은 새어나갑니다. ORM이 원하는 작업을 수행하지 않는 경우 SQL에서 ORM의 작동 방식과 해결 방법을 모두 파악해야 합니다. 인터넷 밈을 빌리려면: 어떤 사람들은 어떤 문제에 직면했을 때, "알아요, ORM을 써야겠어요."라고 생각합니다. 이제 그들은 두 가지 문제를 안고 있습니다. ORM은 거의 사용하지 않으며 대부분 간단한 애플리케이션에 사용합니다. 응용 프로그램이 그렇게 간단한 경우 스트레이트 SQL(또는 SQL 표현식 언어)을 사용할 수도 있습니다.

 

또는 데이터 집합과 같은 간단한 것을 시도할 수 있습니다. SQL, JSON 및 CSV 스토리지를 위한 간단한 ORM을 제공하는 SQLLchemy는 SQL, JSON 및 CSV 스토리지를 제공합니다.