2016-07-30 3 views
4

파이썬에서 sqlite3을 사용하여 메모리 내장 데이터베이스를 만들려고합니다.sqlite를 사용하여 메모리 내장 데이터베이스를 만들려면 어떻게해야합니까?

DB 데이터베이스 파일을 만들고 정보를 저장하는 기능을 만들었습니다.이 기능은 100 % 작동합니다.

그러나 :memory:과 연결을 시도 할 때 몇 가지 문제가 있습니다.

내가하고 있어요 것은 :

import sqlite3 

def execute_db(*args): 
    db = sqlite3.connect(":memory:") 
    cur = db.cursor() 
    data = True 
    try: 
     args = list(args) 
     args[0] = args[0].replace("%s", "?").replace(" update "," `update` ") 
     args = tuple(args) 
     cur.execute(*args) 
     arg = args[0].split()[0].lower() 
     if arg in ["update", "insert", "delete", "create"]: db.commit() 
    except Exception as why: 
     print why 
     data = False 
     db.rollback() 
    db.commit() 
    db.close() 
    return data 
  1. 이 테이블에 몇 가지 정보를 삽입 True

  2. 를 반환 이름 테이블

    execute_db("create table name(name text)") 
    

    을 만들

    no such table: name 
    False 
    

을 반환

execute_db("insert into name values('Hello')") 

왜이 일을하지 않습니다?

db = sqlite3.connect("sqlite3.db") 
+0

왜 데이터를 변경할 때'db.commit()'이 두 개입니까? –

+0

@MartijnPieters 오, 내 나쁜 감사합니다. – Deounix

답변

5

당신은 새로운 연결 함수를 호출 할 때마다 생성 : 나는 파일을 사용할 때 작동합니다. 각 연결 호출은 새로운 메모리 내 데이터베이스를 생성합니다.

함수의 외부 연결을 생성하고 함수에 전달할 또는 만들 shared memory connection :

db = sqlite3.connect("file::memory:?cache=shared") 

마지막 연결이 메모리에서 삭제 될 때, 데이터베이스가 를 삭제됩니다; 귀하의 경우에는 그 기능이 끝날 때마다있을 것입니다.

도 예외 없었다 경우 트랜잭션이 자동으로 최선을 다하고 있습니다
try: 
    with db: 
     cur = db.cursor() 
     # massage `args` as needed 
     cur.execute(*args) 
     return True 
except Exception as why: 
    return False 

, 그렇지 않으면 롤백 :

명시 적으로 db.commit()를 호출하는 것이 아니라, 단지 데이터베이스 연결 as a context manager를 사용합니다. 데이터를 읽는 쿼리 만 커밋해도 안전합니다.

+0

하지만 공유 메모리 연결을 만들면이 연결이 메모리 연결로 빠릅니까? – Deounix

+0

@Deounix : 속도 차이가 없습니다. –

관련 문제