Python을 사용하여 SQLite 기반 간단한 응용 프로그램 만들기

20339 단어 pythonsqlite
표지 사진은 Jan Kahánek에서 Unsplash으로 발송

소개하다.


대부분의 현대 응용 프로그램은 어떤 데이터 저장을 필요로 한다.이를 위해 일반적으로 PostgreSQL, MySQL, Microsoft SQL Server 등 관계 데이터베이스 관리 시스템(RDBMS)을 사용합니다.그러나 초보자들은 그것을 이해하기 어려울 것이다. 이것이 바로 SQLite가 등장했을 때이다.
본고에서 SQLite가 무엇인지, 그리고 Python과 어떻게 결합하여 사용하는지 보여 드리며 간단한 데이터베이스 드라이버를 만들 것입니다.이것은 Python 지식 (변수,if/else 문장, 순환) 을 알고 있다고 가정합니다.우리는 또한 SQL을 사용할 것이다. 만약 당신이 그것에 대해 아무것도 모른다면, SQLBolt은 좋은 출발점이다.당신은 표에 대해 간단한 조회를 어떻게 실행하는지 알아야 합니다.

SQLite 정보


SQLite는 위에서 열거한 것과 유사한 관계 데이터베이스 관리 시스템이지만 현저한 차이가 있습니다!
Wikipedia부터 시작:

In contrast to many other database management systems, SQLite is not a client–server database engine.


이것은 데이터베이스 서버가 없다는 것을 의미한다.모든 데이터는 한 파일에 저장됩니다.또한 데이터베이스를 테스트용 컴퓨터의 RAM에 저장할 수도 있습니다.
SQLite는 Django 등 웹 프레임워크(또는 SQLite 드라이버를 가진 프로그래밍 언어)에도 사용할 수 있다.

응용 프로그램 정보


이 응용 프로그램은 SQLite의 사용을 보여주는 간단한 주석 목록이 될 것입니다.복잡할 거 없어요. 데이터베이스에 중점을 두고 싶어서요.

소프트웨어 선결 조건

  • Python 3 (Python 2 지원 포기)
  • 일반 텍스트 편집기(VScode 사용)
  • SQLite와 관련된 어떤 것도 설치할 필요가 없습니다. Python은 sqlite3 패키지에 SQLite 지원을 내장했습니다.
    가자!

    응용 프로그램 만들기


    초기화


    텍스트 편집기를 열고 새 Python 스크립트를 만듭니다.나는 나의 이름을 notes.py이라고 명명했다.
    앞서 말씀드렸듯이 SQLite 지원은 sqlite3 번들로 제공됩니다.가져오기
    import sqlite3
    
    현재 우리는 데이터베이스 연결을 만들 수 있다.
    # open a SQLite connection
    # a database file called data.db will be created,
    # if it does not exist
    connection = sqlite3.connect('data.db')
    
    # close the connection
    connection.close()
    
  • 'data.db'은 모든 내용일 수 있습니다. (유효한 Python 문자열만 있다면)데이터베이스를 RAM
  • 에 저장하려면 ':memory:'을 사용하십시오.
  • 주의 connection.close() 방법;데이터베이스
  • 에서 사용하는 리소스를 풀려면 이 리소스를 호출해야 합니다.

    데이터베이스에 데이터 나열


    데이터베이스를 조회하기 위해서, 우리는 반드시 database cursor을 만들어야 한다.
    그리고 우리는 그것을 사용하여 조회를 실행할 수 있다.connection = sqlite3.connect('data.db')connection.close() 사이에 다음 코드를 추가합니다.
    # create a database cursor
    cur = connection.cursor()
    
    # query the database for ALL data in the notes table
    cur.execute('SELECT * FROM notes;')
    
    # print the result
    result = cur.fetchall()
    print(result)
    
    # close the cursor
    cur.close()
    
  • 에서 커서를 만든 후 execute 방법으로 데이터베이스
  • 을 조회했습니다.
  • 우리는 조회 결과를 result이라는 변수(fetchall이 원조 목록을 되돌려준다)에 분배하고
  • 을 출력할 것이다.
  • 마찬가지로 커서가 더 이상 필요하지 않을 경우 사용 중인 리소스를 해제합니다(although some people say it's not neccessary)
  • 전체 코드는 다음과 같습니다.
    import sqlite3
    
    
    # open a SQLite connection
    # a database file called data.db will be created,
    # if it does not exist
    connection = sqlite3.connect('data.db')
    
    # create a database cursor
    cur = connection.cursor()
    
    # query the database for ALL data in the notes table
    cur.execute('SELECT * FROM notes;')
    
    # print the result
    result = cur.fetchall()
    print(result)
    
    # close the cursor
    cur.close()
    
    # close the connection
    connection.close()
    

    "이런 테이블 없음" 오류


    지금 이 파이썬 스크립트를 실행하려고 하면 다음과 같은 오류가 발생할 수 있습니다.
    $ python notes.py 
    Traceback (most recent call last):
      File "/home/bartoszg/Dokumenty/code/console-sqlite/notes.py", line 12, in <module>
        cur.execute('SELECT * FROM notes;')
    sqlite3.OperationalError: no such table: notes
    
    이것은 절대적인 정상이다. 우리는 데이터가 없는 새로운 데이터베이스를 조회하려고 한다.
    일반적으로 RDBMS의 데이터는 테이블(relations)에 배치됩니다.

    자료 출처: https://dba.stackexchange.com/questions/187544/designing-a-database-structure-for-companies-and-stock-owners
    위의 데이터베이스에는 세 개의 테이블이 있습니다.
  • 개 회사
  • 회사 식별 번호
  • 업주 필요하면 SQLBolt website에서 표에 대한 더 많은 정보를 읽을 수 있습니다.

    테이블 생성

    notes이라는 새 시계를 묘사해 보도록 하겠습니다.
    테이블 열에는 다음이 포함됩니다.
    ID
  • - 모든 데이터 행에 대해 고유한 ID인 primary key의 정수
  • 이름 - 텍스트, 공백일 수 없음
  • 설명 - 텍스트, 빈
  • SQLite has no VARCHAR type을 참조하십시오.
    다음은 SQL의 모습입니다.
    CREATE TABLE IF NOT EXISTS notes (
        id INTEGER PRIMARY KEY,
        name TEXT NOT NULL,
        description TEXT
    );
    
    Python 코드에 SELECT 조회 전에 놓으십시오.
    # create the database table if it doesn't exist
    table_schema = """
    CREATE TABLE IF NOT EXISTS notes (
        id INTEGER PRIMARY KEY,
        name TEXT NOT NULL,
        description TEXT
    );
    """
    cur.execute(table_schema)
    
    코드는 다음과 같아야 합니다.
    import sqlite3
    
    
    #
    # Establishing connection
    #
    
    # open a SQLite connection
    # a database file called data.db will be created,
    # if it does not exist
    connection = sqlite3.connect('data.db')
    
    # create a database cursor
    cur = connection.cursor()
    
    #
    # Creating the table
    #
    
    # create the database table if it doesn't exist
    table_schema = """
    CREATE TABLE IF NOT EXISTS notes (
        id INTEGER PRIMARY KEY,
        name TEXT NOT NULL,
        description TEXT
    );
    """
    cur.execute(table_schema)
    
    #
    # Querying the database
    #
    
    # query the database for ALL data in the notes table
    cur.execute('SELECT * FROM notes;')
    
    # print the result
    result = cur.fetchall()
    print(result)
    
    #
    # Cleaning up
    #
    
    # close the cursor
    cur.close()
    
    # close the connection
    connection.close()
    
    이 스크립트를 실행하는 경우 다음을 수행합니다.
    $ python notes.py 
    []
    
    예상한 바와 같이, 우리 테이블에는 데이터 줄이 없지만, 오류가 없습니다. 왜냐하면 이 테이블에 존재하기 때문입니다.

    데이터 삽입


    데이터베이스에 새 줄을 삽입하려면 INSERT 문장을 사용합니다.데이터베이스에 대한 질의는 다음과 같습니다.
    INSERT INTO notes (name, description)
    VALUES ('my first note', 'hi, this is the description');
    
    첫 번째 줄에서 우리는 어떤 열을 삽입해야 하는지 설명했고, 두 번째 줄에서 우리는 이 열에 어떤 데이터를 포함해야 하는지를 지정했다.id열은 포함되지 않았습니다.이렇게 하면 자동으로 임의 값으로 설정됩니다.
    이제 Python 코드의 경우:
    #
    # Inserting to the database
    #
    
    # insert some hard-coded data
    insert_query = """
    INSERT INTO notes (name, description)
    VALUES ('my first note', 'hi, this is the description');
    """
    cur.execute(insert_query)
    
    # save it in the database file
    connection.commit()
    
    데이터베이스 부분을 조회하기 전에 놓으세요.

    사용자 정의 데이터, SQL 주입

    'my first note''hi, this is the description'을 교체할 수 있습니다.
    name = input('Note name')
    desc = input('Note description')
    
    # insert some hard-coded data
    insert_query = """
    INSERT INTO notes (name, description)
    VALUES ('{}', '{}');
    """.format(name, desc)
    cur.execute(insert_query)
    
    Hovewer는 데이터베이스가 SQL injection의 공격을 받기 쉽다는 것을 의미합니다.모든 SQL 코드를 실행할 수 있으므로 무시무시한 결과가 발생할 수 있습니다.
    대신 SQL 매개 변수를 사용하여 사용자가 제공한 데이터를 포함하는 SQL 조회를 안전하게 수행합니다.다음은 SELECT ... FROM ... WHERE 질의 사용 예입니다.
    x = int(input())
    y = input()
    
    # the correct way
    cur.execute('SELECT * FROM abc WHERE x = ? AND y = ?', (x, y))
    
    # NEVER DO THIS
    cur.execute(f'SELECT * FROM abc WHERE x = {x} AND y = "{y}"')
    
    # NEVER DO THIS
    cur.execute('SELECT * FROM abc WHERE x = {} AND y = "{}"'.format(x, y))
    
    # NEVER DO THIS
    cur.execute('SELECT * FROM abc WHERE x = %d AND y = "%s"' % (x, y))
    
    이것이 바로 우리가 응용 프로그램에서 그것을 실현하는 방식이다.
    #
    # Inserting to the database
    #
    
    name = input('Note name: ')
    desc = input('Note description: ')
    
    # insert some hard-coded data
    insert_query = """
    INSERT INTO notes (name, description)
    VALUES (?, ?);
    """
    cur.execute(insert_query, (name, desc))
    
    # save it in the database file
    connection.commit()
    
    지금 스크립트를 실행해 보십시오.
    $ python notes.py 
    Note name: hello
    Note description: this is my first note
    [(1, 'hello', 'this is my first note')]
    
    정말 쓸모가 있다!몇 번 운행해 보아라.

    향상된 데이터 표시


    데이터를 Python 배열로 표시하는 것은 우아하지 않습니다.조회 데이터베이스 부분을 수정해서 변경합시다.
    #
    # Querying the database
    #
    
    # query the database for ALL data in the notes table
    cur.execute('SELECT * FROM notes;')
    
    # print the result
    print('\nNotes:')
    for row in cur.fetchall():
        display_name = row[1]
        display_desc = row[2]
    
        print(f'Note name: {display_name}\nNote description: {display_desc}\n')
    
  • 은 우리가 전에 본 바와 같이 cur.fetchall은 하나의 원조수조
  • 으로 되돌아간다
  • row[1]은 2열 값(이름)이고 row[2]은 3열 값이다.첫 번째 값(ID)
  • 을 표시할 필요가 없습니다.
  • \n 문자는 전의 서열이다.그것은 그 위치
  • 에 새 선을 놓았다
    지금 이 스크립트를 실행해 보십시오.많이 좋아진 것 같지 않아요?

    결론


    이것이 바로 이 강좌의 전체 내용이다.읽어 주셔서 감사합니다. 새로운 것을 배웠으면 좋겠습니다.사실, 이것은 나의 첫 번째 문장: D
    우리는 단지 표면에 닿았을 뿐이다.SQLite에 대한 자세한 내용은 SQLite Tutorial을 참조하십시오.
    응용 프로그램의 소스 코드 here에 접근할 수 있습니다.

    숙제


    너는 자신을 단련하고 싶니?
  • 테이블 열 추가 - 작성 날짜, 범주 번호 등
  • 은 데이터베이스의 데이터를 읽거나 쓰기를 원하는지 묻는 등 애플리케이션의 상호 작용을 강화합니다.
  • 은 마지막 5개의 주석만 표시(힌트: ORDER BY and LIMIT 사용)
  • 만약 당신에게 어떤 문제가 있으면 언제든지 질문하세요!

    좋은 웹페이지 즐겨찾기