2014-11-01 3 views
2

SQLite3Python 3으로 잘못하고 있습니다. 어쩌면 내가 SQLite 데이터베이스의 개념을 오해했을 수도 있지만 응용 프로그램을 닫은 후에도 데이터가 데이터베이스에 저장된다고 생각합니까? 데이터를 삽입하고 응용 프로그램을 다시 열면 삽입이 사라지고 데이터베이스가 비어 있습니다.Python Sqlite3 - 데이터가 영구적으로 저장되지 않습니다.

import sqlite3 

def createTable(): 
    conn.execute('''CREATE TABLE VideoFile 
      (ID INTEGER PRIMARY KEY NULL, 
      FileName   TEXT NOT NULL, 
      FilePath   TEXT NOT NULL, 
      numOfFrames   INT  NOT NULL, 
      FPS   INT  NOT NULL, 
      Tags   TEXT NOT NULL, 
      Voting   REAL);''') 


def insert(): 
    conn.execute("INSERT INTO VideoFile (Filename, FilePath, numOfFrames,FPS, Tags, Voting) \ 
           VALUES ('ARCAM_0010_100', 'Categories/Dirt/Small', 2340, 50, 'Bock', 1)"); 
    conn.execute("INSERT INTO VideoFile (Filename, FilePath, numOfFrames,FPS, Tags, Voting) \ 
           VALUES ('ARCAM_0010_100', 'Categories/Dirt/Small', 2340, 50, 'Bock', 1)"); 

def printAll(cursor): 
    cursor = conn.execute("SELECT ID, FileName, FilePath, numOfFrames from VideoFile") 
    for row in cursor: 
     print("ID = ", row[0]) 
     print("FileName = ", row[1]) 
     print("FilePath = ", row[2]) 
     print("numOfFrames = ", row[3], "\n") 

    print("Operation done successfully") 
    conn.close() 


conn = sqlite3.connect('AssetBrowser.db') 
createTable() 

#comment out after executing once 
insert() 
printAll() 

어디 내가 뭐하는 거지 잘못된 : 여기

내 작은 DB입니까?

답변

6

conn.commit()에서 flush the transaction to disk으로 전화하십시오.

마지막으로 처리되지 않은 트랜잭션이 종료되면 마지막 커밋으로 롤백됩니다. (또는 더 정확하게는 the rollback is done by the next program to open the database). 따라서 commit이 호출되지 않으면 데이터베이스가 변경되지 않습니다.

per the docs 것을

:

연결 개체가 자동으로 또는 롤백 트랜잭션을 커밋 컨텍스트 관리자로 사용할 수 있습니다. 예외가 발생하면 롤백됩니다. 그렇지 않으면, 트랜잭션이 최선을 다하고 있습니다 :

따라서,이 같은과 함께 문을 사용하는 경우 :

파이썬이없는 가정 with-statement을 떠날 때 다음 트랜잭션이 자동으로 당신을 위해 최선을 다하고됩니다
with sqlite3.connect('AssetBrowser.db') as conn: 
    createTable() 
    insert() 
    printAll() 

예외를 발생시키는 오류. 이미 존재하지 않는 경우 테이블 만 생성됩니다 다음 그런데


, 당신은 CREATE TABLE IF NOT EXISTS를 사용하는 경우. 이 방법을 사용하면 한 번 호출 한 후 createTable을 주석 처리 할 필요가 없습니다.

def createTable(): 
    conn.execute('''CREATE TABLE IF NOT EXISTS VideoFile 
      (ID INTEGER PRIMARY KEY NULL, 
      FileName   TEXT NOT NULL, 
      FilePath   TEXT NOT NULL, 
      numOfFrames   INT  NOT NULL, 
      FPS   INT  NOT NULL, 
      Tags   TEXT NOT NULL, 
      Voting   REAL);''') 
+0

O_o ​​매우 빨랐습니다! 대답과 링크에 감사드립니다! – user1767754

관련 문제