Web2py-데이터베이스 추상화 계층
그만큼 Database Abstraction Layer (DAL)web2py의 주요 강점으로 간주됩니다. DAL은 기본 SQL 구문에 간단한 API (응용 프로그래밍 인터페이스)를 제공합니다.
이 장에서는 효율적인 태그 검색을위한 쿼리 작성 및 계층 적 범주 트리 작성과 같은 DAL의 중요하지 않은 응용 프로그램에 대해 알아 봅니다.
DAL의 몇 가지 중요한 기능은 다음과 같습니다.
web2py에는 Python 개체를 데이터베이스 개체에 매핑하는 API 인 DAL (데이터베이스 추상화 계층)이 포함되어 있습니다. 데이터베이스 개체는 쿼리, 테이블 및 레코드 일 수 있습니다.
DAL은 데이터베이스 백엔드에 대해 지정된 언어를 사용하여 실시간으로 SQL을 동적으로 생성하므로 개발자가 완전한 SQL 쿼리를 작성해야하는 것은 아닙니다.
DAL 사용의 가장 큰 장점은 응용 프로그램이 다른 종류의 데이터베이스로 이식 가능하다는 것입니다.
DAL 시작하기
web2py의 대부분의 응용 프로그램에는 데이터베이스 연결이 필요합니다. 따라서 데이터베이스 모델 구축은 응용 프로그램 디자인의 첫 번째 단계입니다.
새로 만든 응용 프로그램을 고려하십시오. “helloWorld”. 데이터베이스는 응용 프로그램의 모델 아래에 구현됩니다. 각 응용 프로그램의 모든 모델은-models/db_custom.py.
다음 단계는 DAL을 구현하는 데 사용됩니다-
1 단계-DAL 생성자
데이터베이스 연결을 설정하십시오. DAL 생성자라고도하는 DAL 객체를 사용하여 생성됩니다.
db = DAL ('sqlite://storage.sqlite')
DAL의 주목할만한 특징은 동일한 데이터베이스 또는 다른 데이터베이스와의 다중 연결을 허용한다는 것입니다. 이 줄은 이미 파일에 있습니다.models/db.py. 따라서 삭제하거나 다른 데이터베이스에 연결해야하는 경우가 아니면 필요하지 않을 수 있습니다. 기본적으로 web2py는 파일에 저장된 SQLite 데이터베이스에 연결합니다.storage.sqlite.
이 파일은 응용 프로그램의 데이터베이스 폴더에 있습니다. 파일이 없으면 응용 프로그램이 처음 실행될 때 web2py에 의해 생성됩니다.
SQLite는 빠르며 모든 데이터를 하나의 파일에 저장합니다. 즉, 데이터를 한 응용 프로그램에서 다른 응용 프로그램으로 쉽게 전송할 수 있습니다. 실제로 SQLite 데이터베이스는 응용 프로그램과 함께 web2py에 의해 패키지됩니다. 번역, 조인 및 집계를 포함한 전체 SQL 지원을 제공합니다.
SQLite에는 두 가지 단점이 있습니다.
하나는 열 유형을 적용하지 않으며 열 추가 및 삭제를 제외하고 ALTER TABLE이 없다는 것입니다.
다른 단점은 쓰기 액세스가 필요한 트랜잭션에 의해 전체 데이터베이스가 잠겨 있다는 것입니다.
2 단계-테이블 생성자
데이터베이스와의 연결이 설정되면 define_table 새 테이블을 정의하는 방법.
예를 들면-
db.define_table('invoice',Field('name'))
위의 방법은 Table 생성자 사이에서도 사용됩니다. 테이블 생성자의 구문은 동일합니다. 첫 번째 인수는 테이블 이름이고 그 뒤에는Field(s). 필드 생성자는 다음 인수를 사용합니다.
Sr. 아니요 | 인수 및 사용법 |
---|---|
1 | The field name 테이블의 필드 이름입니다. |
2 | The field type 문자열 (기본값), 텍스트, 부울, 정수 등과 같은 데이터 유형을 갖는 값을 사용합니다. |
삼 | Length 최대 길이를 정의합니다. |
4 | default = None 새 레코드가 삽입 될 때의 기본값입니다. |
5 | update = None 이는 기본값과 동일하게 작동하지만 값은 삽입이 아닌 업데이트에만 사용됩니다. |
6 | Notnull 필드 값이 NULL 일 수 있는지 여부를 지정합니다. |
7 | readable = True 필드를 양식에서 읽을 수 있는지 여부를 지정합니다. |
8 | writable = True 필드가 양식에 쓰기 가능한지 여부를 지정합니다. |
9 | label = "Field Name" 양식에서이 필드에 사용할 레이블입니다. |
그만큼 define_table 메서드는 또한 세 개의 명명 된 인수를 취합니다.
통사론
db.define_table('....',migrate=True, fake_migrate=False, format = '%(id)s')
migrate = True − 이것은 web2py에게 테이블이 존재하지 않는 경우 생성하거나 모델 정의와 일치하지 않는 경우 변경하도록 지시합니다.
fake_migrate = False − 모델이 데이터베이스 테이블 내용과 일치하면 fake_migrate = True로 설정하여 web2py가 데이터를 재 구축하는 데 도움을줍니다.
format = '%(id)s' − 이것은 주어진 테이블의 레코드를 표현하는 방법을 결정하는 형식 문자열입니다.
원시 SQL 생성
DAL을 사용하여 데이터베이스에 대한 연결을 설정하고 테이블 생성자와 필드 생성자를 사용하여 새 테이블과 해당 필드를 만들 수 있습니다.
때로는 필요한 출력을 준수하기 위해 SQL 문을 생성해야합니다. web2py에는 다음과 같이 제공되는 원시 SQL 생성에 도움이되는 다양한 기능이 포함되어 있습니다.
_끼워 넣다
주어진 테이블에 대한 삽입 문을 가져 오는 데 도움이됩니다. 예를 들면
print db.person._insert(name ='ABC')
"person"이라는 테이블에 대한 삽입 문을 검색합니다.
SQL 문 출력-
INSERT INTO person(name) VALUES ('ABC');
_카운트
레코드 수를 제공하는 SQL 문을 가져 오는 데 도움이됩니다. 예를 들어 'person'이라는 이름의 테이블을 고려하고 이름이 'ABC'인 사람의 수를 찾아야합니다.
print db(db.person.name ==' ABC ')._count()
SQL 문 출력-
SELECT count(*) FROM person WHERE person.name = ' ABC ';
_고르다
select SQL 문을 가져 오는 데 도움이됩니다. 예를 들어, 'person'이라는 이름의 테이블을 고려하면 이름이 'ABC'인 사람 목록을 찾아야합니다.
print db(db.person.name == ' ABC ')._select()
SQL 문 출력-
SELECT person.name FROM person WHERE person.name = ' ABC ';
_지우다
가져 오는 데 도움이 delete SQL진술. 예를 들어 'person'이라는 이름의 테이블을 고려하면 이름이 'ABC'인 문을 삭제해야합니다.
print db(db.person.name == ' ABC ')._delete()
SQL 문 출력-
DELETE FROM person WHERE person.name = ' ABC ';4
_최신 정보
업데이트 된 SQL 문을 가져 오는 데 도움이됩니다. 예를 들어, 'person'이라는 테이블을 고려하면 열 이름을 다른 값으로 업데이트해야합니다.
print db(db.person.name == ' ABC ')._update()
SQL 문 출력-
UPDATE person SET WHERE person.name = ’Alex’;
DAL 관련 문제 (Gotchas)
SQLite
SQLite는 열을 삭제하거나 변경하는 기능이 없습니다. 테이블에서 필드를 삭제하면 데이터베이스에서 활성 상태로 유지되므로 web2py는 변경 사항을 인식하지 못합니다.
이 경우 설정이 필요합니다. fake_migrate = True 이는 변경 또는 삭제와 같은 변경 사항이 web2py의 지식하에 유지되도록 메타 데이터를 재정의하는 데 도움이됩니다.
SQLite는 부울 유형을 지원하지 않습니다. 이를 위해 web2py는 내부적으로 Booleans를 1 개의 문자열로 매핑하며 'T'와 'F'는true 과 False 각기.
MySQL
MySQL은 ALTER TABLE 기능을 지원하지 않습니다. 따라서 데이터베이스 마이그레이션에는 여러 커밋이 포함됩니다. 이 상황은 매개 변수를 설정하여 피할 수 있습니다.fake_migrate = True 모든 메타 데이터를 유지하는 데이터베이스를 정의하는 동안
신탁
Oracle은 레코드 페이지 매김 기능을 지원하지 않습니다. 또한 키워드 OFFSET 또는 제한에 대한 지원이 없습니다. 이를 위해 web2py는 복잡한 3 방향 중첩 DAL 선택을 통해 페이지 매김을 수행합니다. Oracle 데이터베이스가 사용 된 경우 DAL은 자체적으로 페이지 매김을 처리해야합니다.