Python SQLAlchemy 라이브러리 사용 방법

1. SQLAlchemy 소개
1.1, SQLAlchemy는 무엇입니까?
qlalchemy는python 언어로 이루어진 관계형 데이터베이스에 대한 orm 라이브러리입니다.Postges, MySQL, SQLite, Oracle 등 대부분의 일반적인 데이터베이스를 연결하는 데 사용할 수 있습니다.
1.2 SQLAlchemy를 사용하는 이유는 무엇입니까?
그것은 당신의 코드를 베이스 데이터베이스와 관련된 SQL 특성에서 추상화합니다.
1.3, SQLAlchemy는 두 가지 주요 사용 모델을 제공했다
  • SQL 표현식 언어(SQLAlchemy Core)
  • ORM
  • 1.4, 어떤 모델을 선택해야 합니까?
    사용하는 프레임워크에 ORM이 내장되어 있지만 더 강력한 보고서 기능을 추가하려면 코어를 선택하십시오.
    SQL과 같은 모드 중심 뷰에서 데이터를 보려면 Core를 사용하십시오.
    만약 당신의 데이터가 업무 대상이 필요하지 않다면 코어를 사용하세요.
    만약 데이터를 업무 대상으로 간주하려면 ORM을 사용하십시오.
    원형을 빠르게 만들려면 ORM을 사용하십시오.
    업무 대상과 문제 영역과 무관한 다른 데이터를 동료가 사용해야 한다면 코어와 ORM을 조합해서 사용하십시오.
    1.5, 데이터베이스 연결
    데이터베이스에 연결하려면 먼저 SQLAlchemy 엔진을 만들어야 합니다.SQLAlchemy 엔진은 데이터베이스에 공통 인터페이스를 만들어서 SQL 문장을 실행합니다.이것은 포장 데이터베이스 연결 탱크와 사투리(서로 다른 데이터베이스 클라이언트)를 통해 이루어진 것이다.
    SQLAlchemy는 엔진을 만드는 함수를 제공합니다.이 함수에서 연결 문자열과 선택할 수 있는 키워드 파라미터를 지정할 수 있습니다.
    
    from sqlalchemy import create_engine
    engine = create_engine('sqlite:///cookies.db')
    engine1 = create_engine('sqlite:///:memory:')
    engine2 = create_engine('sqlite://///home/cookiemonster/cookies.db')
    engine3 = create_engine('sqlite:///c:\\Users\\cookiemonster\\cookies.db')
    
    engine_mysql = create_engine('mysql+pymysql://cookiemonster:chocolatechip', '@mysql01.monster.internal/cookies', pool_recycle=3600)
    1.6, 모드 및 유형
    베이스 데이터베이스에 접근하기 위해서 SQLAlchemy는 데이터베이스에 있는 테이블을 대표하기 위해 어떤 것을 사용해야 합니다.이를 위해 다음 세 가지 방법 중 하나를 사용할 수 있습니다.
    사용자정의 Table 객체 사용
    데이터 테이블을 대표하는 성명식 클래스 사용하기
    데이터베이스에서 추정
    2. SQLAlchemy core
    SQLAlchemy core 정의표 구조는 1.5에서 말한 첫 번째 방식을 사용합니다.테이블 대상은 흔히 볼 수 있는 메타데이터 용기와 연결된 일련의 유형의 열과 속성을 포함한다.
    메타데이터는 Table 객체 디렉토리로 볼 수 있습니다.이 테이블은 MetaData를 통해 사용할 수 있습니다.tables가 방문합니다.
    2.1, 정의표 구조
    SQLAlchemy Core에서 Table 구조 함수를 통해 Table 객체를 초기화합니다.우리는 구조 함수에서 MetaData 대상 (메타데이터) 과 테이블 이름을 제공해야 하며, 그 어떠한 다른 매개 변수도 열 대상으로 여겨진다.열은 Column () 함수를 통해 생성됩니다.
    
    from sqlalchemy import create_engine
    from sqlalchemy import Column
    from sqlalchemy import Integer
    from sqlalchemy import String
    from sqlalchemy import MedaData
    
    metadata = MetaData()
    user = table('user', metadata, 
    			 Column(id, Integer(), primary_key=True), 
    			 Column(name, String(255)), 
    )
    
    engine = create_engine('sqlite:///:memory:')
    metadata.create_all(engine) #  
    2.2 데이터 삽입
    우선 사용자 테이블에 샤오밍을 넣는 insert 문장을 만듭니다.이를 위해 사용자 테이블의 insert () 방법을 호출한 다음values () 문장을 사용합니다. 키워드 매개 변수는 각 열과 상응하는 값입니다.
    
    ins = user.insert().values(
    	id=1, 
     name=' '
    )
    print(str(ins))
    이것은 단지 inset 문장을 만들었을 뿐, 아직 실행되지 않았습니다. 다음에 삽입 작업을 실행합니다.
    
    connection = engine.connect()
    result = connection.execute(ins)
    print(result.inserted_primary_key)
    2.3 데이터 조회
    질의를 작성할 때 select 함수를 사용하십시오. 이것은 표준 SQL SELECT 문장과 유사합니다.
    
    from sqlalchemy.sql import select
    s = select([user])
    #  str(s) 
    print(str(s))
    rp = connection.execute(s)
    results = rp.fetchall()
    2.3.1、ResultProxy
    execute () 함수의 반환값은 인덱스, 이름 또는Column 객체로 접근할 수 있는 ResultProxy 객체입니다.
    ResultProxy 를 사용하여 행 처리
    
    first_row = results[0]
    first_row[1]
    first_row.name
    first_row[user.c.name]
    ResultProxy 교체
    
    rp = connection.execute(s)
    for record in rp:
    	print(record.user_name)
    사용 방법 액세스 결과
    
    rp.first() #  , 
    rp.fetchone() #  , , 
    rp.scalar() #  , 
    2.3.2 조회의 열 수 제어
    
    s = select([user.c.name])
    rp = connection.execute(s)
    print(rp.keys())
    result = rp.first()
    2.3.3 정렬
    
    s = select([user.c.name])
    s = s.order_by(user.c.name)
    rp = connection.execute(s)
    for user in rp:
    	print(user.name)
    2.3.4, 결과 집합의 줄 수 제한
    
    s = select([user.c.name])
    s = s.order_by(user.c.name)
    s = s.limit(2)
    rp = connection.execute(s)
    for user in rp:
    	print(user.name)
    2.3.5, 내장형 SQL 함수 및 레이블
    
    from sqlalchemy.sql import func
    s = select([func.sum(user.c.score)])
    rp = connection.execute(s)
    print(rp.scalar())
    2.3.6 필터링
    검색 필터는 where () 문장을 추가해서 완성됩니다.
    
    s = select([user]).where(user.c.name == ' ')
    rp = connection.execute(s)
    record = rp.first()
    print(record.items())
    여기는 단지 자주 사용하는 조회 방법을 소개했을 뿐입니다. 더 복잡한 조회는 공식 문서를 보십시오.
    2.4, 데이터 업데이트
    업데이트 () 방법은 앞의 insert () 방법과 비슷합니다. 문법은 거의 똑같지만, 업데이트 () 는 where () 자구를 지정하여 어떤 줄을 업데이트해야 하는지 알려 줍니다.
    
    from sqlalchemy import update
    u = update(user).where(user.c.name == ' ')
    u = u.values(name=' ')
    result = connection.execute(u)
    print(result.rowcount)
    2.5, 데이터 삭제
    삭제 문장을 만들 때 delete () 함수를 사용할 수도 있고 테이블의 delete () 방법을 사용할 수도 있습니다.insert () 와 업데이트 () 와 달리, delete () 는 값 인자를 받지 않고, 범문 삭제를 지정하기 위해 선택할 수 있는 where 자구만 수신합니다.
    
    from sqlalchemy import delete
    u = delete(user).where(user.c.name == ' ')
    result = connection.execute(u)
    print(result.rowcount)
    참고:
    더 많은 고급 조작: 연결, 별명, 그룹, 체인 호출, 원시 조회 등, 공식 문서를 보십시오.
    2.5, 트랜잭션
    연결을 통해.begin () 업무를 열고transaction 대상을 되돌려줍니다. 다음에 실행 상황에 따라transaction을 호출합니다.commit () 수정 또는 호출transaction을 제출합니다.rollback () 롤백 작업.
    3. SQLAlchemy orm
    SQLAlchemy orm 정의표 구조는 1.5에서 말한 두 번째 방식을 사용합니다.클래스를 정의하면 declarative_베이스의 특수 기류.declarative_베이스는 메타데이터 용기와 맵 (클래스를 데이터 테이블에 비추는 데 사용) 을 결합시킨다.
    orm에서 사용하는 클래스는 다음과 같은 네 가지 요구를 충족시켜야 한다.
  • declarative_ 상속베이스 대상..
  • 포함 __tablename__,이것은 데이터베이스에서 사용하는 테이블 이름입니다.
  • 하나 이상의 속성을 포함하고 있으며, 그것들은 모두column 대상입니다..
  • 하나 이상의 속성이 주 키를 구성하도록 확보..
  • 3.1, 테이블 구조를 정의합니다.
    
    from sqlalchemy import create_engine
    from sqlalchemy import Column
    from sqlalchemy import Integer
    from sqlalchemy import String
    from sqlalchemy.ext.declarative import declarative_base
    
    Base = declarative_base()
    class User(Base):
     __tablename__ = 'user'
     
    	id = Column(Integer, primary_key=True)
    	name = Column(String(255))
    	
    engine = create_engine('sqlite:///')
    Base.metadata.create_all(engine)
    Session = sessionmaker(bind=engine)
    session = Session()
    3.2 세션
    세션은 SQLAlchemy ORM과 데이터베이스가 상호 작용하는 방식입니다.이것은 엔진 패키지 데이터베이스를 통해 연결되며, 세션을 통해 불러오거나 세션과 관련된 대상에 표지 맵 (identity map) 을 제공합니다.표지 맵은 캐시와 유사한 데이터 구조로 대상 테이블과 키에 의해 확정된 유일한 대상 목록을 포함한다.세션은 세션이 제출되거나 롤백될 때까지 열려 있는 상태로 유지됩니다.
    세션을 만들기 위해 SQLAlchemy는 세션메이커 클래스를 제공합니다. 이 클래스는 전체 프로그램에서 같은 매개 변수로 세션을 만들 수 있도록 합니다.Sessionmaker 클래스는 Session 클래스를 만들어서 이를 실현합니다. Session 클래스는 Sessionmaker 공장에 전달되는 매개 변수에 따라 설정됩니다.
    
    from sqlalchemy import create_engine
    from sqlalchemy.orm import sessionmaker
    
    engine = create_engine('sqlite:///:memory:')
    Session = sessionmaker(bind=engine)
    session = Session()
    3.3, 삽입
    
    user = User(1, ' ')
    session.add(user)
    session.commit()
    3.4, 조회
    
    for row in session.query(User):
    	print(row.id, row.name)
    주의:session.Query () 의 반환 값은 Query 객체로 검색 결과로 사용할 수 없습니다.Query 객체의 사용법에 대해서는 다음을 참조하십시오https://docs.sqlalchemy.org/en/13/orm/query.html#sqlalchemy.orm.query.Query
    일반적인 Query 객체 방법:
    
    q = session.query(User)
    q.count() #  
    q.all() #  list, SQL 
    q.get(id) #  primary_key 
    q.as_scalar() #  SQL 
    3.4.1 조회의 열 수 제어
    
    print(session.query(user.name).first())
    3.4.2 정렬
    
    for record in sesssion.query(user).order_by(user.name):
    	print(user.name)
    3.4.3 결과 집합의 개수를 제한한다
    
    query = session.query(user).order_by(user.name).[:2]
    print([result.user_name for result in query])
    3.4.4, 내장형 SQL 함수 및 레이블
    
    from sqlalchemy import func
    inv_count = session.query(func.sum(user.name)).scalar()
    print(inv_count)
    3.4.5 필터링
    
    record = session.query(user).filter(user.name == ' ')
    print(record)
    3.5, 데이터 업데이트
    
    query = session.query(user)
    xm_user = query.filter(user.user_name == ' ').first()
    xm_user.name = 'robin'
    session.commit()
    print(xm_user.quantity)
    3.6, 데이터 삭제
    
    query = session.query(user)
    xm_user = query.filter(user.user_name == ' ').first()
    session.delete(xm_user)
    session.commit()
    print(xm_user)
    참고:
    SQLAlchemy orm의 흔한 사용법을 간단히 소개합니다. 더 높은 사용법은 공식 문서를 보십시오.
    4. 반사
    반사 기술을 사용하면 먼저 데이터베이스로 SQLAlchemy 객체를 채울 수 있습니다.
    4.1, 단일 테이블 반사
    초기 객체를 만들려면 다음과 같이 하십시오.
    
    from sqlalchemy import Metadata, create_engines
    metadata = MetaData()
    engine = reate_engine('sqlite:///')
    Artist 테이블 반사
    
    from sqlalchmy impport Table
    artist = Table('Artist', metadata, autoload=True, autoload_with=engine)
    4.2, 전체 데이터베이스 반사
    
    metadata.reflect(bind=engine)
    참고 자료
    https://docs.sqlalchemy.org/en/13/core/type_basics.html#generic-types
    이상은 Python SQLAlchemy 라이브러리의 사용 방법에 대한 상세한 내용입니다. 더 많은 Python SQLAlchemy 라이브러리에 대한 자료는 저희 다른 관련 글을 주목해 주십시오!

    좋은 웹페이지 즐겨찾기