2012-03-18 9 views
0

私はPythonを学ぼうとしており、私はPyramidフレームワークを選択しました。しかし、私は、sqlalchemyによって提供されたORMを使用するのではなく、むしろ純粋なSQLを書く(私はまだsqlalchemyを使用しています)。私はkhufu_sqlalchemyを使って設定しています。khufu_sqlalchemyを使用してピラミッドでINSERTを行う方法

ただし、データベースに挿入することはできません。トランザクションは、私のコード
..開始されていますが、コミットされることはありません:

 
    db = dbsession(request) 
    db.execute('insert into users (email, password) values (:email, :password)' , {'email':email, 'password':password})

自動コミットする方法はありますか?ドキュメントは本当にまばらな..です

答えて

1

khufuは、トランザクションマネージャを使用してデータベース接続を処理するピラミッドの慣行に従います。これは、データベースセッションをフックして変更を追跡するコード(ZopeTransactionExtensionがセッション作成者の初期化にあること)を意味します。変更が検出されると、エラーが発生しなければ要求の最後に自動的にコミットされます。 ORMをバイパスして自分自身を実行する場合は、トランザクションマネージャを無効にして自分でコミットするか、executeを実行した後にセッションをダーティとマークすることで、接続が変更されたと思われ、 。第2の方法が好ましいのは、コミットを早めに呼び出すと、残りのコードが失敗する可能性がありますが、データがデータベースに残っているためです。 2番目の方法を実行するには、内線番号のmark_changed機能を使用します。サイドノートとして

from zope.sqlalchemy import mark_changed 
session = DBSession() 
mark_changed(session) 

、あなたはリクエストの終了前にコミットするトランザクションを強制したいならば、あなたは

import transaction 
transaction.commit() 

を経由していることを行うことができます。しかし、再び、これは時に自動的に行われますエラーが発生しなければ要求の終わり。

0

http://docs.sqlalchemy.org/en/latest/core/connections.html

db.commit() 

あなたが探しているものです。自動コミットの詳細については、ドキュメントを参照してください。

+0

トランザクション拡張機能を使用している場合、これは機能しません。トランザクションマネージャがあなたのためにコミットを処理しているため、例外が発生します。 –

関連する問題