sql >> データベース >  >> RDS >> Mysql

MySQLINSERT...一括挿入用のdjango1.4を使用した重複キーの更新

    そこで、カスタムマネージャーを作成しました。マネージャーは次のとおりです。

    class BulkInsertManager(models.Manager):
        def _bulk_insert_or_update(self, create_fields, update_fields, values):
    
            from django.db import connection, transaction
            cursor = connection.cursor()
    
            db_table = self.model._meta.db_table
    
            values_sql = []
            values_data =[]
    
            for value_lists in values:
                values_sql.append( "(%s)" % (','.join([ "%s" for i in range(len(value_lists))]),) )
                values_data.extend(value_lists)
    
            base_sql = "INSERT INTO %s (%s) VALUES " % (db_table, ",".join(create_fields))
    
            on_duplicates = []
    
            for field in update_fields:
                on_duplicates.append(field + "=VALUES(" + field +")")
    
            sql = "%s %s ON DUPLICATE KEY UPDATE %s" % (base_sql, ", ".join(values_sql), ",".join(on_duplicates))
    
            cursor.executemany(sql, [values_data])
            transaction.commit_unless_managed()
    

    そしてサンプルモデル:

    class User_Friend(models.Model):
        objects = BulkInsertManager() # assign a custom manager to handle bulk insert
    
        id = models.CharField(max_length=255)
        user = models.ForeignKey(User, null=False, blank=False)
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=30)
        city = models.CharField(max_length=50, null=True, blank=True)
        province = models.CharField(max_length=50, null=True, blank=True)
        country =  models.CharField(max_length=30, null=True, blank=True)
    

    そしてサンプルの実装:

    def save_user_friends(user, friends):
        user_friends = []
        for friend in friends:
    
            create_fields = ['id', 'user_id', 'first_name', 'last_name', 'city', 'province', 'country']
            update_fields = ['first_name', 'last_name', 'city', 'province', 'country']
    
            user_friends.append(
                [
                    str(user.id), 
                    str(friend['id']),
                    friend['first_name'],
                    friend['last_name'],
                    friend['city'],
                    friend['province'],
                    friend['country'],
                ]
            )
    
        User_Friend.objects._bulk_insert_or_update(create_fields, update_fields, user_friends)
    

    こちらが要点 です。 。



    1. PHPを適切に使用してMySQLオブジェクトをJSONにエンコードするにはどうすればよいですか?

    2. ローリング日付範囲内の個別の値の数を照会します

    3. PostgreSQLでの高可用性の管理–パートII:Replication Manager

    4. PostgreSQLのパラメータ化されたOrderBy/ Limit in table function