SQLAlchemy의 ORM 프레임 워크 SQL 연금술

SQL 연금술

 

SQL 연금술 소개

SQL 연금술 제품 ORM의 아이디어의 구체적인 실현

ORM : 객체 관계 매핑 이데올로기 객체 관계 매핑

데이터베이스는 자원 객체 지향 클래스이며, 객체와 연관된

  테이블 === "클래스

  데이터 === '객체

아이디어는 특정 제품이 SQLAlchemy의 파이썬에서 더 유명하다 달성하는 것입니다,

SQL 연금술은 타사 패키지, 우리는 cmd를 입력 pip3 설치 SQLAlchemy의 설치 할 필요가있다

우리가 작동 할 수있는 몇 가지 기본 작업은 데이터베이스의 클래스와 목적을 달성하기 위해

작업 테이블 만들기

코드를 복사
에서 SQLAlchemy의 가져 오기 create_engine 
sqlalchemy.ext.declarative 가져 오기에서이 declarative_base 
SQLAlchemy의 열 가져 오기, 정수, 문자열, 날짜 시간은, 열거 형, 외래 키, UniqueConstraint, ForeignKeyConstraint가, 색인이 
sqlalchemy.orm 가져 오기 sessionmaker에서, 관계 

# 먼저 연결 개체 데이터베이스 생성 
엔진을 = create_engine ( '+ MySQL의 pymysql : // 루트 : [email protected] :? 3306 / DB4 캐릭터 세트 = UTF8'max_overflow 5 =) 
# 사용자 이름과 암호를 포함하여 조건의 수는, IP 포트를 연결하는 연결을 지정해야합니다, 또한 지정해야 연결 풀 max_overflow는 최대 연결 수를 지정 
#는 참고를 : 거기에 영향을 미치지 않는 문자 인코딩을 지정, 데이터베이스 만들 때 인코딩을 지정해야 

# 기본 클래스를 만들을, 다른 클래스이 클래스는 테이블로 매핑 할 수 있습니다 상속 
기본 = declarative_base () 

클래스 클래스 (자료) : 
    # 테이블의 이름을 지정하는 테이블을 작성 
    __tablename__ = '클래스' 
    # 필드를 소정 지정된 유형과 제약
    ID = 열은 (정수, primary_key와는 = 사실, AUTOINCREMENT = 참) 
    CNAME은 열 = (문자열 (32), null 허용 = 거짓, server_default = '') 
    것을 # 참고 : 기본 값을 설정하는 server_default되어야하며 int 형의 설정하면 기본값은 () STR의 약 설정해야 
    
    요지 = 열 (문자열 (32), null 허용이 = 거짓, server_default = '', 인덱스 = 참)    
    고유 인덱스 또는 인덱스를 추가 한 컬럼에 #이 직접 제공 될 수있다 즉 직접 열에서 수 
    
    열 = (정수하는 외래 키 (Teacher.id))를 classes_id 
    # 첨가 플러스 설정하는 외래 키 () 메소드에 의해, 내부에 배치되어 
    그 중 하나 개의 키 관계이면이 # 키 것은 아웃 많은 관계 조건은 고유 인덱스를 추가해야합니다 
    # EG는 (정수하는 외래 키 (Teacher.id), UNIQUE = 참) 열 =을 classes_id을 

    __table_args__ = (   
        UniqueConstraint (SNAME, 전화 번호, 이름 = 'uix_snname_phone'), 
        인덱스 ( 'ix_addr를' ADDR) 
    ) 
    # 공동 공동 인덱스를 설정하려는 것은 고유 인덱스 또는 단어입니다 그것은 __table_args__의 설정해야합니다 
    UniqueConstraint, 인덱스 완전한 색인에 의해 #
    
    
Base.metadata.drop_all (엔진) # 삭제 
Base.metadata.create_all (엔진) # 만든 
# 마침내 매핑 테이블을 생성하고 위의 두 가지 방법에 의해 요구되는 테이블 삭제 
# 참고 것을 : 
# 1 위, 삭제 만 제거합니다있다 당신이 데이터베이스 테이블 매핑되지 않은 경우 테이블 매핑은, 여유가 없다 삭제 
원래 빈 데이터베이스, 그것은 오류하지 않을 경우 # 
, 이미 존재하는이 테이블 이름을 만든 다음 경우, # 2 이들은 실행하지 등가 생성을 커버하지 않을
코드를 복사

기본 데이터 변경 검색 삭제

코드를 복사
쿼리는 첫 번째 명령을 변환하기위한 쿼리 개체 세션을 생성하고 우리가 결과를 얻을 수 있도록해야한다 
세션 = sessionmaker (바인딩 = egine) #을 연결 개체에 바인딩 할 필요성에 대해 
세션 = 세션 () 

사전 문 : 쿼리 외에 다른 작업을 수행해야 데이터베이스에 실제 동작을 실행에여 session.commit하는 

# ------------------------------------ ------------------------------------ 
add_all ())를 추가 (추가 
#가에서 데이터를 생성해야 더 증가 열이 다른 주요 과제로 설정되지 속성 해당 프로그램이 대상이며, 거기 
OBJ = 클래스 (CNAME = '클래스 2 년) 

session.add (OBJ) #하면 추가 데이터 행을 (객체 추가 ) 

session.add_all ([OBJ, obj2보다]) #에 add_all ()로드 그리스트, 데이터의 복수의 부가 
중 # ------------------------- ----------------------------------------------- 
쿼리 쿼리 ( ) 
# 모든 모든 필드를 가지고 확인 
된 RE = session.query (클래스)을 .ALL ( ) #가 물체 함유하는리스트를 반환 
# 검사가 모두 특정 단어를 취할  
SQL 문 session.query (클래스) # 프린트 아웃
입술 = session.query (클래스) 좁은 방 ( ) #는 그 객체를 반환 제 촬영 

(Classes.cname) .ALL () RES = session.query 
튜플 원소를 함유 #이 목록을 반환을 쿼리 그룹은 값 서 
고해상도 = session.query (Classes.cname) 좁은 방을 ( ) #은 첫 번째를 얻을 반환 튜플 

# 특정 필드를 취할 * 한 SQL 문에 모든 필드의 동등한를 가져 컬럼에 해당합니다 또는 일부 열 
둘 사이 # 차이가 얻을 : 모든 필드는 특정 필드 튜플 돌아와 객체 돌아올 수 있습니다 
특정 조건이 다음과 같은 쿼리 봐야 # 
#을 ---------------- -------------------------------------------------- ------ 
업데이트 () 수정 
변경의 필요성을 찾은 다음 업데이트에 의해 수정 먼저 발견 #을 
(== Classes.id 1.) session.query합니다 (클래스) .filter .update를 ({ 'CNAME': ' XXX '}) 
를 사전에 배치 K # 업데이트, V는 내부 테이블 열 값을 대응 
--------------------------- # --------------------------------------------- 
삭제 () 삭제 
#을 삭제 후도 삭제 먼저 값을 알아 내야하고, 
(클래스) .filter (Classes.id == session.query를 ) (1) .delete를
여 session.commit () 
은 Session.close ()
코드를 복사

다른 쿼리

다음과 같은 SQL 질의 방법에서 연금술은 상기 SQL 문을 달성하기 위해 실질적으로 대응하고있다

어디에

코드를 복사
조건 쿼리 필터 () filter_by () 여기서, 
판정 조건을 작성 # 브래킷 (복수 일 수있다) 다음의 차이 모두 
session.query (클래) .filter (Classes.id ==. 1) 
# 특정 괄호 안에 넣어 이는 목록 가치있는 열 
session.query (클래) .filter_by (상기 식 1에 언급) 
# 브래킷이 과제에 상당하는 열 이름 = 값 (넣어 위상있을 것 이상의 테이블 및 컬럼 이름이 동시에 나타나는 체크인 문제) 
session.query합니다 (클래스) .filter (~ == Classes.id. 1) 
# 의미를 부정한다 ~
코드를 복사

처럼

퍼지 매칭 등 같은 와일드 () 
session.query (클래) .filter (Classes.cname.like ( "킹 %%")) 
필터의 #은 열이 같은 퍼지 매칭 법을 지적하는데 사용될 수있다

~와 ~ 사이에있는

및 BETWEEN) (BETWEEN 
session.query .filter (Classes.id.between (1,2)) (클래) 
# 및 열에 의해 지적도로서, 등, BETWEEN 폐쇄 간격

/ NOT IN에서

하지에서의 IN_ notin_ 
session.query (클래) .filter (Classes.id.in _ ([. 1])) 
session.query (클래) .filter (Classes.id.notin _ ([1,2,4])) 
# 또한 특정 방법에 의해 열을 지적 할 수 
, IN_ 또는 notin_이 반복 가능 객체의 내부에 처해야한다 #주의

한도

제한 슬라이스 
session.query (클래) :. 2 6 : 2] 
# 마이크로톰 구현과 같은리스트 지정된 절단 길이 및 단계 슬라이싱

주문

오더 별 order_by () 
session.query (클래) .order_by (Classes.id.desc ()) 
의 열을 정렬을 지정할 수있는 쿼리로서 #의 order_by는 ASC 내림차순 내림차순 오름차순 방법을 지적하거나 할 
#에게 동일한 브래킷 당신은 또한 여러 열 정렬, 일관된 사용 및 SQL 문 사용을 지정할 수있는

그룹화 (갖는)

코드를 복사
그룹 (기준 GROUP_BY) HAVING () HAVING 
# 그것이 FUNC 방법을 가져와야합니다, 집계 함수를 사용하려면 
sqlalchemy.sql 가져 오기 FUNC의에서 
session.query (func.max (Classes.id)). GROUP_BY (Classes.cname) .having를 (func.max (Classes.id)>. (3)) 
FUNC의 지적해야 쿼리가 사용 # 집계 기능 
마지막 컬럼에 따라 패킷 # 기, 및 (HAVING 지적 할 수있다)의 보조를 조회
코드를 복사

심지어 테이블 쿼리

코드를 복사
비록 테이블 
대체로 균일 테이블 
session.query (클래스, 학생) 
# 직접 문제 직교 제품있을 것, 두 테이블을 연결 
외래 키 판정 통해 # 
session.query (클래스, 학생), 필터 (Classes.id == Student.class_id)는 
()에 가입 연결 왼쪽 
session.query (학생)를 .join (클래) 
# 한 대응 테이블로 조인 만 내부 접속 회원 가입 
session.query를 (학생) .join (클래스, isouter = 참) 
#은 참으로 isouter가 왼쪽으로 연결된다 가입 
하지만, 값이이 클래스의 이름을 얻으려면, 그 클래스는 쿼리에서 테이블을 넣어해야합니다
코드를 복사

정기 검사 페깅

코드를 복사
긍정적 인 체크 동격 관계 
# 숨겨진 속성 테이블은 외래 키 (속성이 컬럼에 정의)이 추가 
= 관계 ATTR ( '는 클래스'역 참조 = 'hideattr') 
첫 번째와 연관된 # 관계를 당신을 테이블의 외래 키는, 역 참조 숨겨진 열을 다른 테이블 인 
경우 
클래스 (베이스) 클래스 : 
    __tablename__이 = '클래스' 
    ID = 열이 (정수, primary_key와는 = 사실 AUTOINCREMENT = 참) 
    CNAME이 열을 = (문자열 (32), Null 허용 = 거짓, server_default = '') 

클래스 학생 (자료) : 
    ID = 열 (정수, primary_key와 = 사실, AUTOINCREMENT = 참) 
    SNAME = 열 (문자열 (32), null 허용이 = 거짓, server_default = '') 
    CLASS_ID = 열 (정수 하는 외래 키 (Classes.id)) 
    class_type = 관계 ( '는 클래스'역 참조 = "XXX") 

# 학생 학생이 테이블에 의해 그렇게.클래스는 대응하는 행을 찾을 CLASS_ID, 포인트 속성 분류 될 수있다
숨겨진 외부 키 테이블을 결합함으로써이 (학생) 열 체크 포지티브 라인이라고 함) 외부 키 테이블 (클래스를 바인딩 쿼리에
# 그리고 클래스가 얼마나 많은 학생들 점이 Classes.id XXX 점을 만날 수 
#이 목록을 지적, 대상 학생의 목록 서 
숨겨진 외래 키 테이블에 의해 바인드 (클래스) 열 체크를 역방향 조회라고 얼마나 많은 표 (학생) 라인과 라인

SQL 연금술 소개

SQL 연금술 제품 ORM의 아이디어의 구체적인 실현

ORM : 객체 관계 매핑 이데올로기 객체 관계 매핑

데이터베이스는 자원 객체 지향 클래스이며, 객체와 연관된

  테이블 === "클래스

  데이터 === '객체

아이디어는 특정 제품이 SQLAlchemy의 파이썬에서 더 유명하다 달성하는 것입니다,

SQL 연금술은 타사 패키지, 우리는 cmd를 입력 pip3 설치 SQLAlchemy의 설치 할 필요가있다

우리가 작동 할 수있는 몇 가지 기본 작업은 데이터베이스의 클래스와 목적을 달성하기 위해

작업 테이블 만들기

코드를 복사
에서 SQLAlchemy의 가져 오기 create_engine 
sqlalchemy.ext.declarative 가져 오기에서이 declarative_base 
SQLAlchemy의 열 가져 오기, 정수, 문자열, 날짜 시간은, 열거 형, 외래 키, UniqueConstraint, ForeignKeyConstraint가, 색인이 
sqlalchemy.orm 가져 오기 sessionmaker에서, 관계 

# 먼저 연결 개체 데이터베이스 생성 
엔진을 = create_engine ( '+ MySQL의 pymysql : // 루트 : [email protected] :? 3306 / DB4 캐릭터 세트 = UTF8'max_overflow 5 =) 
# 사용자 이름과 암호를 포함하여 조건의 수는, IP 포트를 연결하는 연결을 지정해야합니다, 또한 지정해야 연결 풀 max_overflow는 최대 연결 수를 지정 
#는 참고를 : 거기에 영향을 미치지 않는 문자 인코딩을 지정, 데이터베이스 만들 때 인코딩을 지정해야 

# 기본 클래스를 만들을, 다른 클래스이 클래스는 테이블로 매핑 할 수 있습니다 상속 
기본 = declarative_base () 

클래스 클래스 (자료) : 
    # 테이블의 이름을 지정하는 테이블을 작성 
    __tablename__ = '클래스' 
    # 필드를 소정 지정된 유형과 제약
    ID = 열은 (정수, primary_key와는 = 사실, AUTOINCREMENT = 참) 
    CNAME은 열 = (문자열 (32), null 허용 = 거짓, server_default = '') 
    것을 # 참고 : 기본 값을 설정하는 server_default되어야하며 int 형의 설정하면 기본값은 () STR의 약 설정해야 
    
    요지 = 열 (문자열 (32), null 허용이 = 거짓, server_default = '', 인덱스 = 참)    
    고유 인덱스 또는 인덱스를 추가 한 컬럼에 #이 직접 제공 될 수있다 즉 직접 열에서 수 
    
    열 = (정수하는 외래 키 (Teacher.id))를 classes_id 
    # 첨가 플러스 설정하는 외래 키 () 메소드에 의해, 내부에 배치되어 
    그 중 하나 개의 키 관계이면이 # 키 것은 아웃 많은 관계 조건은 고유 인덱스를 추가해야합니다 
    # EG는 (정수하는 외래 키 (Teacher.id), UNIQUE = 참) 열 =을 classes_id을 

    __table_args__ = (   
        UniqueConstraint (SNAME, 전화 번호, 이름 = 'uix_snname_phone'), 
        인덱스 ( 'ix_addr를' ADDR) 
    ) 
    # 공동 공동 인덱스를 설정하려는 것은 고유 인덱스 또는 단어입니다 그것은 __table_args__의 설정해야합니다 
    UniqueConstraint, 인덱스 완전한 색인에 의해 #
    
    
Base.metadata.drop_all (엔진) # 삭제 
Base.metadata.create_all (엔진) # 만든 
# 마침내 매핑 테이블을 생성하고 위의 두 가지 방법에 의해 요구되는 테이블 삭제 
# 참고 것을 : 
# 1 위, 삭제 만 제거합니다있다 당신이 데이터베이스 테이블 매핑되지 않은 경우 테이블 매핑은, 여유가 없다 삭제 
원래 빈 데이터베이스, 그것은 오류하지 않을 경우 # 
, 이미 존재하는이 테이블 이름을 만든 다음 경우, # 2 이들은 실행하지 등가 생성을 커버하지 않을
코드를 복사

기본 데이터 변경 검색 삭제

코드를 복사
쿼리는 첫 번째 명령을 변환하기위한 쿼리 개체 세션을 생성하고 우리가 결과를 얻을 수 있도록해야한다 
세션 = sessionmaker (바인딩 = egine) #을 연결 개체에 바인딩 할 필요성에 대해 
세션 = 세션 () 

사전 문 : 쿼리 외에 다른 작업을 수행해야 데이터베이스에 실제 동작을 실행에여 session.commit하는 

# ------------------------------------ ------------------------------------ 
add_all ())를 추가 (추가 
#가에서 데이터를 생성해야 더 증가 열이 다른 주요 과제로 설정되지 속성 해당 프로그램이 대상이며, 거기 
OBJ = 클래스 (CNAME = '클래스 2 년) 

session.add (OBJ) #하면 추가 데이터 행을 (객체 추가 ) 

session.add_all ([OBJ, obj2보다]) #에 add_all ()로드 그리스트, 데이터의 복수의 부가 
중 # ------------------------- ----------------------------------------------- 
쿼리 쿼리 ( ) 
# 모두 선택, 모든 필드에 걸릴 
고해상도를 = session.query (클래스) .ALL ( #)의 목록을 반환, 포함은 객체 
SQL 문 session.query (클래스) # 프린트 아웃
입술 = session.query (클래스) 좁은 방 ( ) #는 그 객체를 반환 제 촬영 
 
# 검사가 모두 특정 단어를 취할 
(Classes.cname) .ALL () RES = session.query 
튜플 원소를 함유 #이 목록을 반환을 쿼리 그룹은 값 서 
고해상도 = session.query (Classes.cname) 좁은 방을 ( ) #은 첫 번째를 얻을 반환 튜플 

# 특정 필드를 취할 * 한 SQL 문에 모든 필드의 동등한를 가져 컬럼에 해당합니다 또는 일부 열 
둘 사이 # 차이가 얻을 : 모든 필드는 특정 필드 튜플 돌아와 객체 돌아올 수 있습니다 
특정 조건이 다음과 같은 쿼리 봐야 # 
#을 ---------------- -------------------------------------------------- ------ 
업데이트 () 수정 
변경의 필요성을 찾은 다음 업데이트에 의해 수정 먼저 발견 #을 
(== Classes.id 1.) session.query합니다 (클래스) .filter .update를 ({ 'CNAME': ' XXX '}) 
를 사전에 배치 K # 업데이트, V는 내부 테이블 열 값을 대응 
--------------------------- # --------------------------------------------- 
삭제 () 삭제 
#을 삭제 후도 삭제 먼저 값을 알아 내야하고, 
(클래스) .filter (Classes.id == session.query를 ) (1) .delete를
여 session.commit () 
은 Session.close ()
코드를 복사

다른 쿼리

다음과 같은 SQL 질의 방법에서 연금술은 상기 SQL 문을 달성하기 위해 실질적으로 대응하고있다

어디에

코드를 복사
조건 쿼리 필터 () filter_by () 여기서, 
판정 조건을 작성 # 브래킷 (복수 일 수있다) 다음의 차이 모두 
session.query (클래) .filter (Classes.id ==. 1) 
# 특정 괄호 안에 넣어 이는 목록 가치있는 열 
session.query (클래) .filter_by (상기 식 1에 언급) 
# 브래킷이 과제에 상당하는 열 이름 = 값 (넣어 위상있을 것 이상의 테이블 및 컬럼 이름이 동시에 나타나는 체크인 문제) 
session.query합니다 (클래스) .filter (~ == Classes.id. 1) 
# 의미를 부정한다 ~
코드를 복사

처럼

퍼지 매칭 등 같은 와일드 () 
session.query (클래) .filter (Classes.cname.like ( "킹 %%")) 
필터의 #은 열이 같은 퍼지 매칭 법을 지적하는데 사용될 수있다

~와 ~ 사이에있는

및 BETWEEN) (BETWEEN 
session.query .filter (Classes.id.between (1,2)) (클래) 
# 및 열에 의해 지적도로서, 등, BETWEEN 폐쇄 간격

/ NOT IN에서

하지에서의 IN_ notin_ 
session.query (클래) .filter (Classes.id.in _ ([. 1])) 
session.query (클래) .filter (Classes.id.notin _ ([1,2,4])) 
# 또한 특정 방법에 의해 열을 지적 할 수 
, IN_ 또는 notin_이 반복 가능 객체의 내부에 처해야한다 #주의

한도

제한 슬라이스 
session.query (클래) :. 2 6 : 2] 
# 마이크로톰 구현과 같은리스트 지정된 절단 길이 및 단계 슬라이싱

주문

오더 별 order_by () 
session.query (클래) .order_by (Classes.id.desc ()) 
의 열을 정렬을 지정할 수있는 쿼리로서 #의 order_by는 ASC 내림차순 내림차순 오름차순 방법을 지적하거나 할 
#에게 동일한 브래킷 당신은 또한 여러 열 정렬, 일관된 사용 및 SQL 문 사용을 지정할 수있는

그룹화 (갖는)

코드를 복사
그룹 (기준 GROUP_BY) HAVING () HAVING 
# 그것이 FUNC 방법을 가져와야합니다, 집계 함수를 사용하려면 
sqlalchemy.sql 가져 오기 FUNC의에서 
session.query (func.max (Classes.id)). GROUP_BY (Classes.cname) .having를 (func.max (Classes.id)>. (3)) 
FUNC의 지적해야 쿼리가 사용 # 집계 기능 
마지막 컬럼에 따라 패킷 # 기, 및 (HAVING 지적 할 수있다)의 보조를 조회
코드를 복사

심지어 테이블 쿼리

코드를 복사
비록 테이블 
대체로 균일 테이블 
session.query (클래스, 학생) 
# 직접 문제 직교 제품있을 것, 두 테이블을 연결 
외래 키 판정 통해 # 
session.query (클래스, 학생), 필터 (Classes.id == Student.class_id)는 
()에 가입 연결 왼쪽 
session.query (학생)를 .join (클래) 
# 한 대응 테이블로 조인 만 내부 접속 회원 가입 
session.query를 (학생) .join (클래스, isouter = 참) 
#은 참으로 isouter가 왼쪽으로 연결된다 가입 
하지만, 값이이 클래스의 이름을 얻으려면, 그 클래스는 쿼리에서 테이블을 넣어해야합니다
코드를 복사

정기 검사 페깅

코드를 복사
긍정적 인 체크 동격 관계 
# 숨겨진 속성 테이블은 외래 키 (속성이 컬럼에 정의)이 추가 
= 관계 ATTR ( '는 클래스'역 참조 = 'hideattr') 
첫 번째와 연관된 # 관계를 당신을 테이블의 외래 키는, 역 참조 숨겨진 열을 다른 테이블 인 
경우 
클래스 (베이스) 클래스 : 
    __tablename__이 = '클래스' 
    ID = 열이 (정수, primary_key와는 = 사실 AUTOINCREMENT = 참) 
    CNAME이 열을 = (문자열 (32), Null 허용 = 거짓, server_default = '') 

클래스 학생 (자료) : 
    ID = 열 (정수, primary_key와 = 사실, AUTOINCREMENT = 참) 
    SNAME = 열 (문자열 (32), null 허용이 = 거짓, server_default = '') 
    CLASS_ID = 열 (정수 하는 외래 키 (Classes.id)) 
    class_type 관계 = ( '는 클래스'역 참조 = "XXX") 

# 학생 학생이 테이블에 의해 그렇게.클래스는 대응하는 행을 찾을 CLASS_ID, 포인트 속성 분류 될 수있다
숨겨진 외부 키 테이블을 결합함으로써이 (학생) 열 체크 포지티브 라인이라고 함) 외부 키 테이블 (클래스를 바인딩 쿼리에
# 그리고 클래스가 얼마나 많은 학생들 점이 Classes.id XXX 점을 만날 수 
#이 목록을 지적, 대상 학생의 목록 서 
숨겨진 외래 키 테이블에 의해 바인드 (클래스) 열 체크를 역방향 조회라고 얼마나 많은 표 (학생) 라인과 라인

추천

출처www.cnblogs.com/huikejie/p/11112182.html