Python 데이터 지속성-Sqlite3 모듈

CSV, JSON, XML 등의 파일의 주요 단점 중 하나는 본질적으로 구조화되지 않았기 때문에 임의 액세스 및 트랜잭션 처리에 그다지 유용하지 않다는 것입니다. 따라서 내용을 수정하는 것이 매우 어려워집니다.

이러한 플랫 파일은 비동기 처리 기능이 없기 때문에 클라이언트-서버 환경에 적합하지 않습니다. 구조화되지 않은 데이터 파일을 사용하면 데이터 중복과 불일치가 발생합니다.

이러한 문제는 관계형 데이터베이스를 사용하여 극복 할 수 있습니다. 데이터베이스는 중복성과 불일치를 제거하고 데이터 무결성을 유지하기 위해 구성된 데이터 모음입니다. 관계형 데이터베이스 모델은 매우 인기가 있습니다.

기본 개념은 데이터를 엔터티 테이블 (관계라고 함)에 정렬하는 것입니다. 엔티티 테이블 구조는 값이 각 행에 대해 고유 한 하나의 속성을 제공합니다. 이러한 속성을'primary key'.

한 테이블의 기본 키가 다른 테이블의 구조에 나타나면이를 호출합니다. 'Foreign key'그리고 이것은 둘 사이의 관계의 기초를 형성합니다. 이 모델을 기반으로 현재 사용 가능한 인기있는 RDBMS 제품이 많이 있습니다.

  • GadFly
  • mSQL
  • MySQL
  • PostgreSQL
  • 마이크로 소프트 SQL 서버 2000
  • Informix
  • Interbase
  • Oracle
  • Sybase
  • SQLite

SQLite는 다양한 애플리케이션에서 사용되는 경량 관계형 데이터베이스입니다. 자체 포함, 서버리스, 구성이 필요없는 트랜잭션 SQL 데이터베이스 엔진입니다. 전체 데이터베이스는 파일 시스템의 어느 곳에 나 배치 할 수있는 단일 파일입니다. 매우 작은 설치 공간과 구성이없는 오픈 소스 소프트웨어입니다. 임베디드 장치, IOT 및 모바일 앱에서 널리 사용됩니다.

모든 관계형 데이터베이스는 테이블의 데이터를 처리하기 위해 SQL을 사용합니다. 그러나 이전에 이러한 각 데이터베이스는 데이터베이스 유형에 특정한 Python 모듈의 도움으로 Python 응용 프로그램과 연결되었습니다.

따라서 그들 사이에는 호환성이 부족했습니다. 사용자가 다른 데이터베이스 제품으로 변경하고 싶다면 어려울 수 있습니다. 이 비 호환성 문제는 'Python Enhancement Proposal (PEP 248)'을 제기하여 DB-API로 알려진 관계형 데이터베이스에 대한 일관된 인터페이스를 권장함으로써 해결되었습니다. 최신 권장 사항이 호출됩니다.DB-API버전 2.0. (PEP 249)

Python의 표준 라이브러리는 Python 프로그램을 통해 SQLite 데이터베이스를 처리하기위한 DB-API 호환 모듈 인 sqlite3 모듈로 구성됩니다. 이 장에서는 SQLite 데이터베이스와 Python의 연결에 대해 설명합니다.

앞에서 언급했듯이 Python은 sqlite3 모듈의 형태로 SQLite 데이터베이스에 대한 지원을 내장하고 있습니다. 다른 데이터베이스의 경우 각각의 DB-API 호환 Python 모듈은 pip 유틸리티를 사용하여 설치해야합니다. 예를 들어 MySQL 데이터베이스를 사용하려면 PyMySQL 모듈을 설치해야합니다.

pip install pymysql

다음 단계는 DB-API에서 권장됩니다-

  • 다음을 사용하여 데이터베이스와의 연결 설정 connect() 기능을 수행하고 연결 개체를 얻습니다.

  • 요구 cursor() 커서 객체를 얻기위한 연결 객체의 메소드.

  • 실행할 SQL 문으로 구성된 쿼리 문자열을 구성합니다.

  • 다음을 호출하여 원하는 쿼리를 실행합니다. execute() 방법.

  • 연결을 닫습니다.

import sqlite3
db=sqlite3.connect('test.db')

여기서 db는 test.db를 나타내는 연결 개체입니다. 데이터베이스가 아직 존재하지 않으면 생성됩니다. 연결 개체 db에는 다음과 같은 방법이 있습니다.

Sr. 아니. 방법 및 설명
1

cursor():

이 Connection을 사용하는 Cursor 객체를 반환합니다.

2

commit():

보류중인 트랜잭션을 데이터베이스에 명시 적으로 커밋합니다.

rollback():

이 선택적 메서드는 트랜잭션이 시작 지점으로 롤백되도록합니다.

4

close():

데이터베이스에 대한 연결을 영구적으로 닫습니다.

커서는 주어진 SQL 쿼리에 대한 핸들 역할을하여 하나 이상의 결과 행을 검색 할 수 있도록합니다. Cursor 객체는 다음 문을 사용하여 SQL 쿼리를 실행하기 위해 연결에서 얻습니다-

cur=db.cursor()

커서 객체에는 다음과 같은 방법이 정의되어 있습니다.

Sr. 아니요 방법 및 설명
1

execute()

문자열 매개 변수에서 SQL 쿼리를 실행합니다.

2

executemany()

튜플 목록의 매개 변수 집합을 사용하여 SQL 쿼리를 실행합니다.

fetchone()

쿼리 결과 집합에서 다음 행을 가져옵니다.

4

fetchall()

쿼리 결과 집합에서 나머지 모든 행을 가져옵니다.

5

callproc()

저장 프로 시저를 호출합니다.

6

close()

커서 개체를 닫습니다.

다음 코드는 test.db에 테이블을 만듭니다.

import sqlite3
db=sqlite3.connect('test.db')
cur =db.cursor()
cur.execute('''CREATE TABLE student (
StudentID INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT (20) NOT NULL,
age INTEGER,
marks REAL);''')
print ('table created successfully')
db.close()

데이터베이스에서 원하는 데이터 무결성은 다음에 의해 달성됩니다. commit()rollback()연결 개체의 메서드. SQL 쿼리 문자열에 예외를 발생시킬 수있는 잘못된 SQL 쿼리가있을 수 있으므로 올바르게 처리해야합니다. 이를 위해 execute () 문이 try 블록 내에 배치됩니다. 성공하면 commit () 메서드를 사용하여 결과를 지속적으로 저장합니다. 쿼리가 실패하면 rollback () 메서드를 사용하여 트랜잭션이 취소됩니다.

다음 코드는 test.db의 student 테이블에 대해 INSERT 쿼리를 실행합니다.

import sqlite3
db=sqlite3.connect('test.db')
qry="insert into student (name, age, marks) values('Abbas', 20, 80);"
try:
   cur=db.cursor()
   cur.execute(qry)
   db.commit()
print ("record added successfully")
except:
   print ("error in query")
   db.rollback()
db.close()

사용자 입력에 의해 동적으로 제공되는 INSERT 쿼리의 values ​​절에있는 데이터를 원할 경우 Python DB-API에서 권장하는 매개 변수 대체를 사용합니다. ? 문자는 쿼리 문자열에서 자리 표시 자로 사용되며 execute () 메서드에서 튜플 형식으로 값을 제공합니다. 다음 예제는 매개 변수 대체 방법을 사용하여 레코드를 삽입합니다. 이름, 나이 및 마크가 입력으로 사용됩니다.

import sqlite3
db=sqlite3.connect('test.db')
nm=input('enter name')
a=int(input('enter age'))
m=int(input('enter marks'))
qry="insert into student (name, age, marks) values(?,?,?);"
try:
   cur=db.cursor()
   cur.execute(qry, (nm,a,m))
   db.commit()
   print ("one record added successfully")
except:
   print("error in operation")
   db.rollback()
db.close()

sqlite3 모듈은 executemany()한 번에 여러 레코드를 추가 할 수있는 방법입니다. 추가 할 데이터는 각 튜플에 하나의 레코드를 포함하는 튜플 목록에 제공되어야합니다. 목록 개체는 쿼리 문자열과 함께 executemany () 메서드의 매개 변수입니다. 그러나 executemany () 메서드는 일부 다른 모듈에서 지원되지 않습니다.

그만큼 UPDATE쿼리에는 일반적으로 WHERE 절에 지정된 논리식이 포함됩니다. execute () 메서드의 쿼리 문자열에는 UPDATE 쿼리 구문이 포함되어야합니다. name = 'Anil'의 'age'값을 23으로 업데이트하려면 다음과 같이 문자열을 정의합니다.

qry="update student set age=23 where name='Anil';"

업데이트 프로세스를보다 동적으로 만들기 위해 위에서 설명한대로 매개 변수 대체 방법을 사용합니다.

import sqlite3
db=sqlite3.connect('test.db')
nm=input(‘enter name’)
a=int(input(‘enter age’))
qry="update student set age=? where name=?;"
try:
   cur=db.cursor()
   cur.execute(qry, (a, nm))
   db.commit()
   print("record updated successfully")
except:
   print("error in query")
   db.rollback()
db.close()

마찬가지로, SQL의 DELETE 쿼리 구문이있는 문자열로 execute () 메서드를 호출하여 DELETE 작업을 수행합니다. 덧붙여서DELETE 쿼리에는 일반적으로 WHERE 절.

import sqlite3
db=sqlite3.connect('test.db')
nm=input(‘enter name’)
qry="DELETE from student where name=?;"
try:
   cur=db.cursor()
   cur.execute(qry, (nm,))
   db.commit()
   print("record deleted successfully")
except:
   print("error in operation")
   db.rollback()
db.close()

데이터베이스 테이블에서 중요한 작업 중 하나는 여기에서 레코드를 검색하는 것입니다. SQL 제공SELECT목적에 대한 쿼리. SELECT 쿼리 구문이 포함 된 문자열이 execute () 메서드에 제공되면 결과 집합 개체가 반환됩니다. 결과 집합에서 하나 이상의 레코드를 검색 할 수있는 커서 개체를 사용하는 두 가지 중요한 메서드가 있습니다.

fetchone ()

결과 세트에서 사용 가능한 다음 레코드를 가져옵니다. 가져온 레코드의 각 열 값으로 구성된 튜플입니다.

fetchall ()

튜플 목록 형식으로 남아있는 모든 레코드를 가져옵니다. 각 튜플은 하나의 레코드에 해당하며 테이블의 각 열 값을 포함합니다.

다음 예제는 학생 테이블의 모든 레코드를 나열합니다.

import sqlite3
db=sqlite3.connect('test.db')
37
sql="SELECT * from student;"
cur=db.cursor()
cur.execute(sql)
while True:
   record=cur.fetchone()
   if record==None:
      break
   print (record)
db.close()

SQLite 데이터베이스 대신 MySQL 데이터베이스를 사용하려면 다음을 설치해야합니다. PyMySQL위에서 설명한대로 모듈. 데이터베이스 연결 프로세스의 모든 단계는 동일합니다. MySQL 데이터베이스가 서버에 설치되어 있기 때문에 connect () 함수에는 URL과 로그인 자격 증명이 필요합니다.

import pymysql
con=pymysql.connect('localhost', 'root', '***')

SQLite와 다를 수있는 유일한 것은 MySQL 특정 데이터 유형입니다. 마찬가지로 pyodbc 모듈을 설치하여 모든 ODBC 호환 데이터베이스를 Python과 함께 사용할 수 있습니다.