1

私は(現在)Djangoを使用してデータを効果的に表示しているレガシーアプリケーションを持っています。私の作業テストの1つのサンプルは次のようになります。

def test_add_property_value(self):
    """Test set / get a value"""
    # This will do some external process which occcurs to the db.
    pm = Pm(mysql_db='test_bugs')
    tree =  pm.add_release_tree()
    prop_type, pmvalue = ("string", "Funny Business")
    pmproperty = "%s_%s_basic" % (tree[0].name, prop_type)
    pm.add_property_definition(pmproperty, prop_type=prop_type)
    pm.add_propval(pmproperty, value=pmvalue, project=tree[0].name)

    # Now use Django to pull the value back out..
    project = Project.objects.get(name=tree[0].name)
    property = project.get_property(pmproperty) # Custom query using sql.raw
    self.assertEqual(pmvalue, property.value)

ご覧のとおり、これは基本的なA/Bテストです。今、私は制限を見つけました、そして私はその複数の外部の追加-チェック-ループクエリが失敗していることを回避することができないようです。上記のコードの変更は、クエリの実行さえ失敗しているように見えるため失敗します。

def test_add_property_value(self):
    """Test set / get a value"""

    # This will do some external process which occcurs to the db.
    pm = Pm(mysql_db='test_bugs', p4_port = settings.ICMSERVER_TEST_PORT)
    tree = pm.add_release_tree()
    prop_type, pmvalue = ("string", "Funny Business")
    pmproperty = "%s_%s_basic" % (tree[1].name, prop_type)
    pm.add_property_definition(pmproperty, prop_type=prop_type)
    pm.add_propval(pmproperty, value=pmvalue, project=tree[1].name)

    # Now use Django to pull the value back out..
    project = Project.objects.get(name=tree[1].name)
    property = project.get_property(pmproperty)
    self.assertEqual(pmvalue, property.value)

    # ONLY CHANGE WAS TO ADD THIS..

    # This will do some external process which occcurs to the db.
    pmproperty = "%s_%s_basic_two" % (tree[1].name, prop_type)
    pm.add_property_definition(pmproperty, prop_type=prop_type)
    pm.add_propval(pmproperty, value=pmvalue, project=tree[1].name)

    # Now use Django to pull the value back out..
    project = Project.objects.get(name=tree[1].name)
    property = project.get_property(pmproperty)
    self.assertEqual(pmvalue, property.value)

CACHE_BACKENDについて読みましたが、役に立たなかったようです。他のアイデアはありますか?さらに調査したところ、これは私の外部データベースとはまったく関係がないようです。ああ..それは月曜日のように感じます!

  1. これはキャッシュの問題ですか?ところで、CACHE_BACKEND ='dummy:///'または'locmem:///'を設定しても何も起こりませんでした。
  2. この問題をより適切に診断するにはどうすればよいですか?

ありがとう

アップデート

これが最終的な答えでした-2つの小さな調整..ダニエルセヴェリオに基づいています。ポインタに感謝します!!

class PropertyTests(TransactionTestCase):  #CHANGE1
    def test_add_property_value(self):
        """Test set / get a value"""

        import logging
        l = logging.getLogger('django.db.backends')
        l.setLevel(logging.DEBUG)
        l.addHandler(logging.StreamHandler())

        # This will do some external process which occcurs to the db.
        pm = Pm(mysql_db='test_bugs', p4_port = settings.ICMSERVER_TEST_PORT)
        tree = pm.add_release_tree()
        prop_type, pmvalue = ("string", "Funny Business")
        pmproperty = "%s_%s_basic" % (tree[1].name, prop_type)
        pm.add_property_definition(pmproperty, prop_type=prop_type)
        pm.add_propval(pmproperty, value=pmvalue, project=tree[1].name)

        # Now use Django to pull the value back out..
        project = Project.objects.get(name=tree[1].name)
        property = project.get_property(pmproperty)
        self.assertEqual(pmvalue, property.value)

        # This will do some external process which occcurs to the db.
        pmproperty = "%s_%s_basic_two" % (tree[1].name, prop_type)
        pm.add_property_definition(pmproperty, prop_type=prop_type)
        pm.add_propval(pmproperty, value=pmvalue, project=tree[1].name)

        # Now use Django to pull the value back out..
        Project.objects.update() #CHANGE2
        project = Project.objects.get(name=tree[1].name)
        property = project.get_property(pmproperty)
        self.assertEqual(pmvalue, property.value)
4

1 に答える 1

1

それはおそらくトランザクションの問題ではありません。マネージャー(Project.objects)は、短期間存続するように設計されているため、データの変更について通知を受ける必要があります。

同じクエリを2回クエリしているProject.objects.get(name=tree[1].name)と、マネージャはすでに正しいデータを持っていると見なすため、再度実行することはありません。

2番目のクエリの直前に、

Project.objects.update()

マネージャーのキャッシュを無効にします。無効化後の結果は最新である必要があります。

于 2011-08-11T16:15:54.647 に答える