2014-01-17 1 views
1

peewee (python orm 라이브러리)의 단일 트랜잭션에 모든 인스턴스를 저장하는 방법은 무엇입니까? 예 :peewee (python)의 단일 트랜잭션에서 모든 인스턴스를 저장하는 방법은 무엇입니까?

from peewee import SqliteDatabase, Model, TextField 

DB_NAME = 'users.db' 
db = SqliteDatabase(os.path.join(os.path.dirname(__file__), DB_NAME)) 


class Users(Model): 

    user_id = IntegerField(index = True) 
    name = TextField(null = True, index = True) 
    password = TextField(null = True) 
    description = TextField(null = True) 
    class Meta: 
     database = db 

if not Drugs.table_exists(): 
    Drugs.create_table() 

data_to_save = [('user1', 'pass1'), ('user2', 'pass2'), ('user3', 'pass3')] 

for user_name, user_password in data_to_save: 
    user_data = Users.get_or_create(name=user_name, password=user_password) 
    user_data.save() 

단일 트랜잭션으로 재 작성하는 방법은 무엇입니까?

답변

1

는 경고합니다. db_transaction()에 대해서는 조심해야한다고 생각합니다. 왜냐하면 지금까지 내가 그걸 가지고 놀아 왔기 때문에, 깨졌습니다. 기본적으로 트랜잭션 격리는 제공하지 않습니다. 격리를 위해 직접 데이터베이스 트랜잭션을 사용하는 것이 좋습니다. 이러한 오류를 여러 번 보았 기 때문에 너무 기쁩니다. 이러한 문제를 체크하기 위해 항상 테스트 코드를 작성하고 있습니다. 그리고 맹목적으로 가짜 주장을 신뢰하지 않습니다. 이것은 Python 3.4 및 SQLite3을 사용하는 동안. 격리가 작동하도록하려면 db.execute_sql ('begin;')을 사용하는 것이 좋습니다. 왜냐하면 작업이 수행되고 필수 잠금을 생성하기 때문에 (이 경우 일명 낙관적 동시성 제어) 지연 될지라도.

+0

나는이 주석을 추가하기를 원한다. 트랜잭션에서 행을 읽고 읽으려고 시도하는 동안 행을 잠그도록 MySQL/Postgres에 어려움을 겪고 있다면, [for update method] (http://peewee.readthedocs.org/en/latest/peewee/api.html?highlight=for_update#SelectQuery.for_update). 참고 : SQLite에서는 지원되지 않습니다. –

관련 문제