私のプログラムではトランザクションを使用していないので、すべてのデータベース操作がすぐにコミットされると考えていました。
テーブル内の値を探しているphpプログラムがあり、見つかった場合はIDを返します。見つからない場合は、新しい行を書き込みます。後でそれが繰り返され、挿入したばかりのデータが見つかるはずですが、見つからないため、重複エラーが発生します。
その挿入後に有効な結果が返されるように、mysql にデータを強制的に書き込むにはどうすればよいですか? テーブルをフラッシュしようとしましたが、結果は変わりませんでした。
詳細:
mysql の一般的な問題だと思っていましたが、Cakephp の Model Query の使用に関連しているようです。
コントローラーを使用して CSV ファイルを複数のテーブルに解析しているため、モデルをオンザフライでバインドし、クエリ呼び出しを使用してデータをテーブルに挿入します。私はアプリケーションの残りの部分に CakePHP を使用していますが、解析機能は一種の使い捨て機能であるため、エレガントにするために多くの時間を費やしませんでした。
インポート モデルには関連付けられたテーブルがないため、追跡モデルに手動でバインドします。
関連するクエリへのコードの言い換え:
$this->Import->bindModel(array('hasOne' => array('Tracking')));
$insert =<<<DONE
INSERT INTO tracking (id, created, employee_id, client_id, borrower_name, loan_number,
loan_amount, activity_id, program_id, rate_id, lock_period,
lo_price, investor_price, committed_price, purchase_advice_price,
lock_type, investor_id, time_taken, notes,audited,audit_notes,
import_notes, import_error, uniqueness)
VALUES (NULL, '%s', %d, %d, '%s', '%s',
%.2f, %d, %d, %d, %d,
%.5f, %.5f, %.5f, %.5f,
%d, %d, %d, '%s', %d, '%s',
'%s', %d, %d)
DONE;
while ($row = fgetscsv($fh))
# Lots of processing deleted
if (! $this->_exists($row))
{
$sql = vsprint($insert, $row);
$this->Import->Tracking->query($sql); # This is where I'll get a duplicate error
}
} # end of function
# I've created a unique index on columns that should be unique and I do the query on
# them here.
private _exists($mydata)
{
$find = "SELECT id FROM tracking WHERE created = '%s' AND employee_id = %d" AND
activity_id = $d AND ...";
$sql = sprintf($find, $mydata[0], $mydata[1]);
return $this->Import->Tracking->query($sql);
}
そのため、問題は Cakephp であり、モデル クエリで何をしているようにも見えます。
おそらく、このコードを Cake からヤンクしてスタンドアロンの php プログラムを使用できますが、すでに Cakephp を使用していたので、そこにインポート モデルを投入することにしました。
追加コメント:選択は正しいですが、長いので逐語的に転記しませんでした。省略記号を使用してそれを示しました。mysqlセッションにコピー/貼り付けしてデータを選択できるため、機能します。2回目に実行すると、データが見つかります。
コントローラーを終了するまでコミットされない大きなトランザクションに Cakephp が全体をラップしている可能性があると、他の誰かに思われますか? 2回目の実行でそれらの行が見つかる理由を説明していませんか?
Cakephp にこれらの挿入をコミットさせる方法を理解する必要があると思います。または、これに Model->query を使用して別の方法で行うべきではないか、プロジェクトのこの部分に Cakephp を使用しないでください。
====
ありがとう!